haskell - 为什么不是 (20 >) 。长度 。取 10 === const True

tl;dr

事实不是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/

相关文章:

arrays - 将 + 或 += 与 array#map 一起使用?

python - 为什么有些功能pass了

r - 在嵌套列表中从第一个列表中选择第一个元素,从第二个列表中选择第二个元素,依此类推

nuxt.js - 如何在 Nuxt 3 中间件获取当前域?

python - 如何找到具有最少步数的元素

python - 在 Python 中用正则表达式替换 '(' 时出错

module - 是否有一种简洁/内联的方式来创建 Set 值而不显式命名它们的类型?

r - 根据特定列中的数据框条目添加新列的最快方法是什么

awk - 用键分隔行并存储在不同的文件中

ios - Xcode 构建失败 : Requested but did not find exte