英語は話せません。遅延評価
だと思います。それは評価され、 "abc"、 "efg"と印刷されます。
main = return (map putStrLn ["abc", "efg"]) >> return()
しかし、私はそれをテストし、動作しません。
英語は話せません。遅延評価
だと思います。それは評価され、 "abc"、 "efg"と印刷されます。
main = return (map putStrLn ["abc", "efg"]) >> return()
しかし、私はそれをテストし、動作しません。
map putStrLn ["abc", "efg"]
あなたが実行されていないタイプ[IO()]
の値のリストを返します。その代わりに、の値を取得するには、リスト上でreturn
を呼び出しています。
あなたはsequence_
機能をIO a
値のリストを実行することができます。return x >> y
が原因にy
と同じであり、任意のモナドで
main = mapM_ putStrLn ["abc", "efg"]
ありがとうございます。 larsmans。非常に有用なコメント。 – user1286894
:
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_
を使用することです。
非常に便利なコメントをいただきありがとうございます。おかげでハンマー。非常に役立ちます。がんばろう。 – user1286894
質問にスパムを追加することは「あなたの質問が短すぎます」という良い反応ではありません。より良い方法は、より有用な情報を追加することかもしれません;)たとえば、何かを印刷する必要があると思われる理由を説明してください。 – delnan
ありがとうございます。デルナン – user1286894