在Haskell中混合折叠器与OR(懒惰?)

pep*_*e22 6 evaluation haskell functional-programming declarative lazy-evaluation

该函数如何返回true?

foldr (||) False [True,undefined] 

=> True
Run Code Online (Sandbox Code Playgroud)

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

undefined || True 
Run Code Online (Sandbox Code Playgroud)

,这应该返回一个错误

因此,我猜测haskell优先考虑OR函数的懒惰,而不是逐步进行折叠.找到一个True在途中并在开始折叠之前返回

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

Wil*_*ess 12

根据定义foldr,

foldr (||) False [True,undefined]
=
True || foldr (||) False [undefined]
Run Code Online (Sandbox Code Playgroud)

根据定义(||),

True || _ = True
Run Code Online (Sandbox Code Playgroud)

所以没有必要知道右手表达的价值来知道答案.

foldr没有做自己的步骤.该过程由减速器功能的要求驱动.

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