我不太会说英语。
我认为。它将被评估,并打印"abc","efg“。
main = return (map putStrLn ["abc", "efg"]) >> return ()但是,我测试了它,它不工作。
发布于 2012-05-07 23:28:12
map putStrLn ["abc", "efg"]返回一个[IO ()]类型的值列表,然后您将不再执行该列表;相反,您将对该列表调用return以获取IO [IO ()]类型的值。
您可以使用sequence_函数执行一系列IO a值:
main = sequence_ (map putStrLn ["abc", "efg"])或者使用速记mapM_
main = mapM_ putStrLn ["abc", "efg"]发布于 2012-05-08 00:09:22
在任何monad中,由于monad laws,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_,如另一个答案所示。
https://stackoverflow.com/questions/10484681
复制相似问题