我不擅长说英语。
我认为。它将被评估,并打印“abc”、“efg”。
main = return (map putStrLn ["abc", "efg"]) >> return ()
但是,我测试了它,它不起作用。
我不擅长说英语。
我认为。它将被评估,并打印“abc”、“efg”。
main = return (map putStrLn ["abc", "efg"]) >> return ()
但是,我测试了它,它不起作用。
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"]
在任何单子中,由于单子法则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_
,如另一个答案所示。