首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MonadPlus和永远-这是什么关系?

MonadPlus和永远-这是什么关系?
EN

Stack Overflow用户
提问于 2022-06-01 14:29:05
回答 2查看 460关注 0票数 6

我看到这里

代码语言:javascript
复制
-- Note that "forever" isn't necessarily non-terminating.
-- If the action is in a @'MonadPlus'@ and short-circuits after some number of iterations.
-- then @'forever'@ actually returns `mzero`, effectively short-circuiting its caller.

老实说,我不明白这张纸条。它们是否意味着可以用MonadPlus来打破MonadPlus,例如- IO Bool?比方说,IO False会打破它.

从一个角度来看,IO也是MonadPlus。也许我必须用其他东西包装我的IO Bool,以实现用IO BoolMonadPlus破坏forever的可能性?这张便条到底是什么意思?

当然,我可以例外地打破它,也可以实现自己的forever,但是我感兴趣的是这个奇怪的注释。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-06-01 14:44:43

您可以查看forever是如何实现的:

代码语言:javascript
复制
forever :: Applicative f => f a -> f b -> f b
forever a = let a' = a *> a' in a'

(*>)的文档说它“顺序操作,放弃第一个参数的值”。它基本上是一个应用程序的(>>),而不是单一的。

因此,如果您查看forever是如何实现的,您将看到它基本上被扩展为:

代码语言:javascript
复制
forever a = a *> a *> a *> ...

正如forever描述所述,如果应用程序有一些短路行为,它仍然可以终止而不是评估无限的操作序列:

代码语言:javascript
复制
ghci> forever $ Nothing
Nothing
ghci> forever $ Just 1
-- infinite loop trying to evaluate Just 1 *> Just 1 *> Just 1 *> ...

这是因为(Nothing *> _) = Nothing后面的(*>)甚至没有被计算,所以Nothing *> Nothing *> Nothing *> ...短路到Nothing,而不必计算无限的动作列表。

票数 12
EN

Stack Overflow用户

发布于 2022-06-01 14:46:07

人们可能天真地认为,forever m只是永远存在:

代码语言:javascript
复制
forever m = m >> forever m
          = m >> m >> forever m
          = m >> m >> m >> ...  -- forever

但是评论中提到有一些方法可以打破循环,mzero是一个简洁的例子,它以等价的方式展示了这种情况,而不是从操作上考虑异常。mzero满足所有wmzero >> w = mzero,因此:

代码语言:javascript
复制
forever mzero = mzero >> forever mzero
              = mzero

问题是,单点选择使forever比命令语言中的while (true)循环更具通用性。

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

https://stackoverflow.com/questions/72463564

复制
相关文章

相似问题

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