在 Haskell 中将 foldr 与 OR 混合(懒惰?)

mixing foldr with OR in Haskell (laziness?)

这个函数怎么会return为真?

foldr (||) False [True,undefined] 

=> True

第一个折叠看起来像这样:

undefined || True 

,这应该 return 一个错误

所以我猜 haskell 优先考虑 OR 函数的惰性而不是逐步进行折叠。在途中找到 True 并在开始折叠之前找到 returns

这是正确的吗?在那种情况下,haskell 是否总是优先于非惰性函数的惰性函数?我相信这是懒惰的定义,但似乎可以改变答案使其错误

根据foldr的定义,

foldr (||) False [True,undefined]
=
True || foldr (||) False [undefined]

根据(||)的定义,

True || _ = True

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

foldr 不会 自己执行步骤。该过程由减速器功能的需求驱动。

编辑: 没什么好笑的。每个评估步骤都根据所涉及的定义直接完成。