事实不是20 < length $ take 10 $ whatever
吗?需要 whatever
成功模式补丁列表(至少 []
或 (_:_)
)是“缺乏”懒惰?
或者,换句话说,为什么不是 (20 >) . length . take 10 === const True
, 所以将它们中的任何一个应用于任何事物都不需要对论证进行任何评估?
是(20 >) . length . take 10 !== const True
必需品?还是设计选择?无论哪种情况,为什么?
这是对 my previous question 的跟进.
在那里我问了为什么 <a href="https://hackage.haskell.org/package/base-4.16.1.0/docs/Data-Function.html#v:fix" rel="noreferrer noopener nofollow">fix</a> error
版画 *** Exception:
反复无限。
答案令人满意。
但是,我尝试了一下 ghci
并意识到 take 0 $ fix error
预期返回 ""
, 和 length $ take 0 $ fix error
返回 0
.
另一方面,下面打印了*** Exception:
无限流:
20 > (length $ take 10 $ fix error)
我明白如果即使是fix error
的一个元素被计算(实际上是尝试计算),结果就是这样,但我的问题是:为什么首先需要对它们中的任何一个进行评估,在那个特定的表达式中?毕竟,length $ take 10 $ whatever
不能不是 <= 10
,因此 < 20
, 因此表达式的计算结果应为 True
.
实际上,我看到了 20 > (length $ take 10 $ [fix error])
立即返回 True
.可能重点是take 10
期望在 [a]
上工作,等等 length $ take 10 $ [fix error]
不需要评估 fix error
确保它在 [a]
上工作.事实上,我已经验证了 20 > (length $ take 10 $ undefined)
也有错误(即使没有无限重复的错误),而 20 > (length $ take 10 $ [undefined])
返回 True
.
也许这就是Willem Van Onsem meant in this comment .
无论如何,因为我可以将上面的表达式写成
((20 >) . length . take 10) $ fix error
我很想这么说
(20 >) . length . take 10 === const True
因此我认为 ((20 >) . length . take 10) $ fix error
是合理的返回 True
就像const True $ fix error
返回 True
.
但事实并非如此。为什么?
最佳答案
take 10
必须确定其参数是 []
还是 (:)
值。
const True
没有。
length
是严格的,因为它必须遍历整个参数。组合并不意味着它只需迭代足够多的值以获得足够大的数字来伪造 (20 >)
。
关于haskell - 为什么不是 (20 >) 。长度 。取 10 === const True,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72145610/