2012-05-07 190 views
1

我不好说英语。懒惰的评价

我想。它将被评估,并打印“abc”,“efg”。

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

但是,我测试了它,它不起作用。

+1

追加垃圾邮件的问题是*不是很好的回答“你的问题太短”!更好的方法可能是添加更多有用的信息;)例如,解释为什么你认为它应该打印一些东西。 – delnan

+0

谢谢。 delnan。 – user1286894

回答

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

返回[IO()]类型的值,你那么不执行的列表;相反,您在列表中调用return以获得类型为IO [IO()]的值。

您可以执行IO a值的列表与sequence_功能:

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

或使用简短的mapM_

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

谢谢。 larsmans。非常有用的评论。 – user1286894

5

在任何单子,return x >> y相同ymonad 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()这就是为什么没有任何反应。懒惰的评估与它无关。

最简单的修复方法是使用mapM_,如其他答案所示。

+0

感谢您的非常有用的评论。感谢哈马尔。很有帮助。祝你好运。 – user1286894