首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >懒惰评估

懒惰评估
EN

Stack Overflow用户
提问于 2012-05-07 23:22:46
回答 2查看 132关注 0票数 1

我不太会说英语。

我认为。它将被评估,并打印"abc","efg“。

代码语言:javascript
复制
main =  return (map putStrLn ["abc", "efg"]) >> return ()

但是,我测试了它,它不工作。

EN

回答 2

Stack Overflow用户

发布于 2012-05-07 23:28:12

代码语言:javascript
复制
map putStrLn ["abc", "efg"]

返回一个[IO ()]类型的值列表,然后您将不再执行该列表;相反,您将对该列表调用return以获取IO [IO ()]类型的值。

您可以使用sequence_函数执行一系列IO a值:

代码语言:javascript
复制
main  =  sequence_ (map putStrLn ["abc", "efg"])

或者使用速记mapM_

代码语言:javascript
复制
main  =  mapM_ putStrLn ["abc", "efg"]
票数 7
EN

Stack Overflow用户

发布于 2012-05-08 00:09:22

在任何monad中,由于monad lawsreturn x >> yy是相同的。

代码语言:javascript
复制
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_,如另一个答案所示。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10484681

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档