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

包含底部类型的可折叠上的Haskell折叠交换关联函数,haskell,associative,commutativity,bottom-type,Haskell,Associative,Commutativity,Bottom Type,我最近尝试运行代码: > let _l_ = _l_ > any [True, _l_, False] True > any [False, _l_, True] > -- _l_ 我想知道这是否被认为是正确的行为,因为any被定义为foldr(| |)False,|是关联和交换的 难道|l|u|u|u|u|u |真==真| u|u|u |不应该是真的吗 我将如何实现一个任何,从而产生一个关联的、可交换的函数应用程序 我是一个新的尝试了解底部;|是否应该返回 谢谢这种

我最近尝试运行代码:

> let _l_ = _l_
> any [True, _l_, False]
True
> any [False, _l_, True]

> -- _l_
我想知道这是否被认为是正确的行为,因为
any
被定义为
foldr(| |)False
|
是关联和交换的

难道
|l|u|u|u|u|u |真==真| u|u|u |
不应该是真的吗

我将如何实现一个
任何
,从而产生一个关联的、可交换的函数应用程序

我是一个新的尝试了解底部;
|
是否应该返回


谢谢

这种行为是正确的

不应该为真

在底部存在的情况下,这是不正确的
|
必须首先计算一侧,然后如果该值为
False
,则必须计算另一侧。GHC.Classes中的定义是

(||)                    :: Bool -> Bool -> Bool
True  || _              =  True
False || x              =  x
你可以看到它首先检查左参数。如果左参数是bottom,那么计算会发散,整个过程就是bottom。但是如果左参数是
True
,则永远不会检查右参数,因此即使它位于底部,结果仍然是
True

(False | | | | | | | True==False | | | | | True)是真的吗?

这是真的,两个值都是底部<代码>| |
即使在存在底部的情况下也是关联的,但不是可交换的


有几种方法可以用来构建可交换的
any
,但它们往往涉及并发性。一种方法是使用一个函数,如,它竞争两个值,如果其中一个值为
True
,则返回
True
;如果两者都返回
False
,则返回
False
,否则发散。或者你可以自己构建。

我认为只有在“经典逻辑”部分才能保证可交换性。一旦你允许“非经典”结果,比如非终止,就不可能保证结果会是什么,更不用说交换性了


例如,计算
any(repeat False++[True])
永远不会产生与
any(True:repeat False)
相同的结果。好吧,一旦
foldr
计算的值在列表中的某个点变为
True
|
的定义显示在
True | x
中,无需对
x
进行评估–结果始终为
True
。因此,如果
foldr
到目前为止看到了
True
,那么列表的其余部分由于懒惰而未被评估。在第二种情况下,底部出现在尚未遇到任何
True
的位置,因此必须对底部进行评估。评估底部产生底部。在底部,
| |
不是真正的可交换:
真的| |未定义的
真的
,而
未定义的|真的
未定义的
。你把可交换性和懒惰混为一谈。如果<代码> > <代码>不是懒惰的,它会产生<代码> true>Ly==γLys* true < COD>> >如果考虑底部,则不可交换。(重复false)++[true ]将不计算为真。因此,即使是
por
也不是可交换的。我不认为任何人可以在存在非终止的情况下提供交换性。@SassaNF:你可以在两个参数中都严格要求它,这将使它具有交换性;然而,这样会使短路失效。@SassaNF到底是底部的数学属性阻止了可交换性,还是因为它不可能在现实世界中实现?@user2063685、@Vitus和其他人(甚至我)提到,如果
|
是严格的,它将再次变为可交换的——但这是在某种非常松散的意义上理解的。从数学上讲,
124;
是一种无人居住的类型,这意味着它无法构造值,因此也无法定义相等。因此,即使我们声明
| | | | | | | |
严格,也不可能证明
| | | | |
True | | | |
实际上是平等的。@SassaNF⊥不表示此上下文中的空类型。它表示非终止或错误(
未定义
错误
)。在Haskell中,我们没有真正的空类型,正是因为
(想想
未定义的
)可以被赋予任何类型。如果我们认为
Bool
Bool={True,False,⊥}
,然后strict
|
确实是可交换的。这两个表达式是不相等的。你必须记住
的某些可交换版本:
。@augustss在topic starter将
any
应用于值列表的上下文中,这只是将bottom作为
|
的参数之一提供给@SassaNF:I ag的另一种方式这说明了处理非终止计算的一些困难,但这与问题的情况不同。用于组合
repeat False++[True]
的运算符在这里完全不相关,因为折叠需要无限次遍历才能到达
True
元素。