这个函数怎样才能返回true?
第一折叠看起来像这样:
foldr (||) False [True,undefined]
=> True
第一折叠看起来像这样:
undefined || True
我猜测Haskell将OR函数的惰性优先于逐步执行folds。 在开始fold之前,在中途找到一个True
并返回。
是否正确?在这种情况下,Haskell是否总是优先考虑惰性函数而不考虑非惰性函数? 我相信这就是懒惰的定义,但似乎它可以改变答案并使其错误。
undefined || True
?因为这是不正确的,所以如果你能解释为什么你相信这一点,我们或许可以找出你推出这个结论的错误推理。 - Daniel Wagnerfoldr
从右边开始折叠,就像在严格语言中经常发生的那样,这将是对(||)
的第一次评估。 - Carlfoldr
确实是从右边折叠的。它的“第一个”折叠是undefined || False
,结果是undefined
。而“第二个”则是True || undefined
,结果是True
,因为OR是惰性的(在Java、C等语言中也是如此)。 - chiundefined || False
,而不是undefined || True
!正如你所观察到的那样,这确实会变成undefined
,但与惰性语言不同的是,仅仅因为计算的某个部分是undefined
并不意味着整个计算都是undefined
... - Daniel Wagner