1

私は英語を話すのが苦手です。

おもう。評価され、「abc」、「efg」を出力します。

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

しかし、私はそれをテストしましたが、うまくいきません。

4

2 に答える 2

7
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"]
于 2012-05-07T15:28:11.670 に答える
5

どのモナドでも、はモナドの法則によるものと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_、他の回答に示されているように、を使用することです。

于 2012-05-07T16:09:21.580 に答える