我不会说英语。
我想。它将被评估,并打印“abc”,“efg”。
main = return (map putStrLn ["abc", "efg"]) >> return ()
但是,我测试了它,它不起作用。
答案 0 :(得分:7)
map putStrLn ["abc", "efg"]
返回类型[IO ()]
的值列表,然后您不执行该列表;相反,您在列表中调用return
以获取类型为IO [IO ()]
的值。
您可以使用IO a
函数执行sequence_
值列表:
main = sequence_ (map putStrLn ["abc", "efg"])
或使用简写mapM_
:
main = mapM_ putStrLn ["abc", "efg"]
答案 1 :(得分:5)
在任何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_
,如另一个答案所示。