我最近尝试运行代码:
> let _l_ = _l_
> any [True, _l_, False]
True
> any [False, _l_, True]
> -- _l_
我想知道这是否被认为是正确的行为,因为 any
被定义为 foldr (||) False
并且 ||
是关联的并且可交换。
不应该_l_ ||真==真|| _l_
为 true,且 (False || _l_) ||真==假|| (_l_ || True)
是真的吗?
我如何实现一个 any
来生成关联、可交换的函数应用程序?
我刚开始尝试理解底部; ||
是否应该返回?
谢谢
最佳答案
这种行为是正确的。
不应该_l_ ||真==真|| _l_是真的
在有底部的情况下,情况并非如此。 ||
必须首先评估一侧,然后如果该值为 False
,则必须评估另一侧。 GHC.Classes 的定义是
(||) :: Bool -> Bool -> Bool
True || _ = True
False || x = x
所以你可以看到它首先检查左边的参数。如果左边的参数是底部,那么计算就会发散,整个事情就是底部。但是,如果左侧参数为 True
,则永远不会检查右侧参数,因此即使它位于底部,结果仍然为 True
。
(False || _l_) ||真==假|| (_l_ || True) 是真的吗?
这是真的,两个值都是底部。 ||
即使存在底部也是结合的,但不是可交换的。
您可以采用几种方法来构建可交换的 any
,但它们往往涉及并发。一种方法是使用类似 por 的函数,它会比较两个值,如果其中一个为 True
,则返回 True
;如果两者都返回 False
,则返回 False
,否则发散。或者您可以自己构建它。
关于Haskell 在包含底部类型的 Foldables 上折叠交换、关联函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20418961/