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 回答