在 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
不会 自己执行步骤。该过程由减速器功能的需求驱动。
编辑: 没什么好笑的。每个评估步骤都根据所涉及的定义直接完成。
这个函数怎么会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
不会 自己执行步骤。该过程由减速器功能的需求驱动。
编辑: 没什么好笑的。每个评估步骤都根据所涉及的定义直接完成。