我看这里
-- 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 Bool
和MonadPlus
打破forever
的可能性?这个注解到底是什么意思?
当然,我可以打破它与例外或实现自己的forever
,但我的兴趣是关于这个奇怪的注意。
2条答案
按热度按时间ubby3x7f1#
您可以查看
forever
是如何实现的:(*>)
的文档中说它 “对动作进行排序,丢弃第一个参数的值”。它基本上是一个(>>)
,用于应用来代替单子。因此,如果您查看
forever
是如何实现的,您会发现它基本上扩展为:正如
forever
描述所述,如果Applicationative有一些短路行为,它仍然可以终止,并且不计算无限的动作序列:这是因为跟在
(*>)
后面的(Nothing *> _) = Nothing
甚至没有被求值,所以Nothing *> Nothing *> Nothing *> ...
短路到Nothing
,而不必求值无限的动作列表。1tuwyuhd2#
人们可能会天真地认为
forever m
会永远持续下去:但是注解中提到有一些方法可以打破循环,
mzero
是一个简洁的例子,它用等式来演示这种情况,而不是用运算来思考异常。mzero
对所有w
都满足mzero >> w = mzero
,因此:重点是选择monad使得
forever
比命令式语言中的while (true)
循环更通用。