【问题标题】:Understanding the representation of inifinite lists as the limit of partial lists in haskell将无限列表的表示理解为haskell中部分列表的限制
【发布时间】:2016-11-12 08:09:48
【问题描述】:

我正在阅读 this 文章,该文章解释了 Haskell 的非严格语义。直到作者开始在 Haskell 中谈论 部分和无限列表,我才明白。

作者说:-

这个想法是将无限列表理解为部分列表的限制


然后,作者继续解释表达式的执行:-

filter (< 3) [1..]

结果有点违背我对预期输出的直觉。我认为答案很简单:-[1, 2]。但是,不! 虽然作者的解释足以理解执行过程以及我们如何获得最终结果,但它并没有解释为什么它会这样工作。

所以,我的问题是为什么无限列表表示为一堆部分列表的限制?有人可以在不深入研究复杂的数学术语的情况下解释这一点吗?

谢谢

【问题讨论】:

  • 为什么你会认为结果会是[1, 2]filter 无法知道何时停止检查元素...例如考虑:cycle [1..N] 包含无限数量的 1s 和 2s 但如果你只看一个有限的前缀它看起来与[1..] 非常相似,您可以选择任意大小的N
  • 哦,是的。对不起,我对filtertakewhile 感到很困惑。我对haskell很陌生。对不起这个愚蠢的愚蠢混乱。我现在将编辑问题。

标签: list haskell types infinite


【解决方案1】:

简单地说,Haskell 编译器并不神奇,尽管它有时会显得很神奇。虽然与其他编程语言相比,某些类型的表达式看起来非常具有声明性,但 Haskell 的求值语义实际上非常简单。

因此,在您提到的示例中,filter (< 3) [1..],GHC 对上述表达式的含义一无所知。虽然很明显,2 之后永远不会有任何元素满足(< 3) 谓词,但filter 没有理由知道不会有最终是一些可以做到的元素。因此,尝试计算结果列表的前两个元素以外的任何元素都会产生无限循环。

这就是 Haskell 中无限列表实际上只是“限制”的解释背后的想法。一个真正的分析系统可以处理无限的列表,它可以对它们的所有元素做出断言。从数学上可以简单地证明,由 Haskell 表达式 [1..] 表示的无限列表仅包含两个小于 3 的元素,但 Haskell 没有任何此类分析能力——它只是一种函数式编程语言。

使用数学极限的类比,我们可以说在给定无限的时间和空间的情况下,评估 [1..] 接近于无限列表,但没有它,它只是一个计算——我们总是可以产生更多元素的承诺如果我们想要,但与数学上的无限集不同,它不是对真正无限的元素集的某种高级描述。它只是一组具有任意大小的有限元素,以及如何获得更多元素的描述。

【讨论】:

    猜你喜欢
    • 2015-01-10
    • 2017-02-10
    • 2018-04-27
    • 1970-01-01
    • 2019-06-03
    • 1970-01-01
    • 2017-09-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多