Haskell 在包含底部类型的 Foldables 上折叠交换、关联函数

标签 haskell associative commutativity bottom-type

我最近尝试运行代码:

> 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/

相关文章:

haskell - 所有的 Haskell 包都相互兼容吗?

haskell - 如何反转haskell中的图形?

javascript - 遍历空 javascript 数组返回数组对象函数

haskell - SBV lib 似乎在解决 SAT 问题时变慢了,如何使用 picosat/miniSAT?

php - 将关联数组更改为索引数组/获取 Zend_Table_Row_Abstract 作为非关联

python sqlalchemy动态获取列名?

类似于 Powershell 的运算符不可交换

r - 添加 NA 和计算结果为 NaN 的表达式会根据顺序返回不同的结果,是否违反了交换性?

javascript - JavaScript 中 reduceRight 的原生实现是错误的

haskell - 有没有人编译过避免 Haskell 标准库中的 "not polymorphic enough"定义所需的导入列表?