包含底部类型的可折叠上的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
元素。