haskell MonadPlus 和 永远 - - 是 什么 关系 ?

hrysbysz  于 2022-11-14  发布在  其他
关注(0)|答案(2)|浏览(184)

我看这里

-- 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来破解forever,比如-IO Bool?比如说,IO False会破解它......
从一个Angular 来看,IO也是MonadPlus。也许我必须用别的东西来 Package 我的IO Bool,以实现用IO BoolMonadPlus打破forever的可能性?这个注解到底是什么意思?
当然,我可以打破它与例外或实现自己的forever,但我的兴趣是关于这个奇怪的注意。

ubby3x7f

ubby3x7f1#

您可以查看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描述所述,如果Applicationative有一些短路行为,它仍然可以终止,并且不计算无限的动作序列:

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,而不必求值无限的动作列表。

1tuwyuhd

1tuwyuhd2#

人们可能会天真地认为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

重点是选择monad使得forever比命令式语言中的while (true)循环更通用。

相关问题