我不好说英语。懒惰的评价
我想。它将被评估,并打印“abc”,“efg”。
main = return (map putStrLn ["abc", "efg"]) >> return()
但是,我测试了它,它不起作用。
我不好说英语。懒惰的评价
我想。它将被评估,并打印“abc”,“efg”。
main = return (map putStrLn ["abc", "efg"]) >> return()
但是,我测试了它,它不起作用。
map putStrLn ["abc", "efg"]
返回[IO()]
类型的值,你那么不执行的列表;相反,您在列表中调用return
以获得类型为IO [IO()]
的值。
您可以执行IO a
值的列表与sequence_
功能:
main = sequence_ (map putStrLn ["abc", "efg"])
或使用简短的mapM_
:
main = mapM_ putStrLn ["abc", "efg"]
谢谢。 larsmans。非常有用的评论。 – user1286894
在任何单子,return x >> y
相同y
因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()
这就是为什么没有任何反应。懒惰的评估与它无关。
最简单的修复方法是使用mapM_
,如其他答案所示。
感谢您的非常有用的评论。感谢哈马尔。很有帮助。祝你好运。 – user1286894
追加垃圾邮件的问题是*不是很好的回答“你的问题太短”!更好的方法可能是添加更多有用的信息;)例如,解释为什么你认为它应该打印一些东西。 – delnan
谢谢。 delnan。 – user1286894