在Haskell中将foldr和OR混合使用(惰性计算?)

6
这个函数怎样才能返回true?
foldr (||) False [True,undefined] 

=> True

第一折叠看起来像这样:
undefined || True 

我猜测Haskell将OR函数的惰性优先于逐步执行folds。 在开始fold之前,在中途找到一个True并返回。

是否正确?在这种情况下,Haskell是否总是优先考虑惰性函数而不考虑非惰性函数? 我相信这就是懒惰的定义,但似乎它可以改变答案并使其错误。


4
为什么你认为第一个折叠(fold)看起来像 undefined || True?因为这是不正确的,所以如果你能解释为什么你相信这一点,我们或许可以找出你推出这个结论的错误推理。 - Daniel Wagner
1
@DanielWagner 如果foldr从右边开始折叠,就像在严格语言中经常发生的那样,这将是对(||)的第一次评估。 - Carl
1
@Carl 有人可能会争辩说,从引用上来看,foldr确实是从右边折叠的。它的“第一个”折叠是undefined || False,结果是undefined。而“第二个”则是True || undefined,结果是True,因为OR是惰性的(在Java、C等语言中也是如此)。 - chi
4
将“从右折叠”与“从右向左迭代”进行比较,表明你仍然过于命令式地思考。“从右折叠”只是关于结合性的陈述,并不意味着更多。 - Silvio Mayolo
1
@Carl 在某种意义上,它确实从右边折叠;但在这个意义上,“第一个”折叠实际上是 undefined || False,而不是 undefined || True!正如你所观察到的那样,这确实会变成 undefined,但与惰性语言不同的是,仅仅因为计算的某个部分是 undefined 并不意味着整个计算都是 undefined... - Daniel Wagner
1个回答

13
根据foldr的定义,
foldr (||) False [True,undefined]
=
True || foldr (||) False [undefined]
根据 (||) 的定义,
True || _ = True

因此,无需知道右侧表达式的值即可知道答案。

foldr不会自行执行步骤。该过程由Reducer函数的需求驱动。

编辑:没有任何有趣的事情发生。每个评估步骤都根据涉及的定义直截了当地完成。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接