私は英語を話すのが苦手です。
おもう。評価され、「abc」、「efg」を出力します。
main = return (map putStrLn ["abc", "efg"]) >> return ()
しかし、私はそれをテストしましたが、うまくいきません。
私は英語を話すのが苦手です。
おもう。評価され、「abc」、「efg」を出力します。
main = return (map putStrLn ["abc", "efg"]) >> return ()
しかし、私はそれをテストしましたが、うまくいきません。
map putStrLn ["abc", "efg"]
type の値のリストを返します[IO ()]
が、これは実行していません。return
代わりに、 type の値を取得するためにリストを呼び出していますIO [IO ()]
。
次の関数IO a
を使用して、値のリストを実行できます。sequence_
main = sequence_ (map putStrLn ["abc", "efg"])
または省略形を使用しますmapM_
:
main = mapM_ putStrLn ["abc", "efg"]
どのモナドでも、はモナドの法則によるものとreturn x >> y
同じです。y
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 ()
遅延評価はそれとは何の関係もありません。
最も簡単な修正はmapM_
、他の回答に示されているように、を使用することです。