2012-05-07 24 views
1

英語は話せません。遅延評価

だと思います。それは評価され、 "abc"、 "efg"と印刷されます。

main = return (map putStrLn ["abc", "efg"]) >> return() 

しかし、私はそれをテストし、動作しません。

+1

質問にスパムを追加することは「あなたの質問が短すぎます」という良い反応ではありません。より良い方法は、より有用な情報を追加することかもしれません;)たとえば、何かを印刷する必要があると思われる理由を説明してください。 – delnan

+0

ありがとうございます。デルナン – user1286894

答えて

7
map putStrLn ["abc", "efg"] 

あなたが実行されていないタイプ[IO()]の値のリストを返します。その代わりに、の値を取得するには、リスト上でreturnを呼び出しています。

あなたはsequence_機能をIO a値のリストを実行することができます。return x >> yが原因にyと同じであり、任意のモナドで

main = mapM_ putStrLn ["abc", "efg"] 
+0

ありがとうございます。 larsmans。非常に有用なコメント。 – user1286894

5

main = sequence_ (map putStrLn ["abc", "efg"]) 

または速記mapM_を使用monad laws

return x >> y 
= return x >>= \_ -> y -- definition of >> 
= (\_ -> y) x    -- left identity monad law 
= y      -- apply the lambda 

したがって、return (map putStrLn ["abc", "efg"]) >> return()は何も起こらない理由であるreturn()と同じです。レイジー評価はそれとは関係ありません。

最も簡単な修正は、もう1つの答えに示すように、mapM_を使用することです。

+0

非常に便利なコメントをいただきありがとうございます。おかげでハンマー。非常に役立ちます。がんばろう。 – user1286894