懒惰的评价

时间:2012-05-07 15:22:46

标签: haskell

我不会说英语。

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

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

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

2 个答案:

答案 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 lawsreturn x >> yy相同。

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_,如另一个答案所示。