我看到这里了
-- 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 Bool和MonadPlus破坏forever的可能性?这张便条到底是什么意思?
当然,我可以例外地打破它,也可以实现自己的forever,但是我感兴趣的是这个奇怪的注释。
发布于 2022-06-01 14:44:43
您可以查看forever是如何实现的:
forever :: Applicative f => f a -> f b -> f b
forever a = let a' = a *> a' in a'(*>)的文档说它“顺序操作,放弃第一个参数的值”。它基本上是一个应用程序的(>>),而不是单一的。
因此,如果您查看forever是如何实现的,您将看到它基本上被扩展为:
forever a = a *> a *> a *> ...正如forever描述所述,如果应用程序有一些短路行为,它仍然可以终止而不是评估无限的操作序列:
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,而不必计算无限的动作列表。
发布于 2022-06-01 14:46:07
人们可能天真地认为,forever m只是永远存在:
forever m = m >> forever m
= m >> m >> forever m
= m >> m >> m >> ... -- forever但是评论中提到有一些方法可以打破循环,mzero是一个简洁的例子,它以等价的方式展示了这种情况,而不是从操作上考虑异常。mzero满足所有w的mzero >> w = mzero,因此:
forever mzero = mzero >> forever mzero
= mzero问题是,单点选择使forever比命令语言中的while (true)循环更具通用性。
https://stackoverflow.com/questions/72463564
复制相似问题