list - Haskell 范围表示法生成列表。意外输出

标签 list haskell range-notation

我在一次讲座中遇到了一个练习,这让我对 [2, 2 .. 2] 的输出感到困惑。为什么在输入 [2, 2 .. 2] 时会生成一个带有 2 的“无限”列表。

我理解该符号的方式是第一个元素是开始界限,第二个元素是数字之间的“间隙”,最后一个是列表的结尾,换句话说,当达到该数字时停止。

如果我的推理是正确的,为什么表达式 [2, 2 .. 2] 不输出 [2]?。

我认为 Haskell 可能会这样评估它。

  • 打印第一个元素时
    它等于的列表
    最后,因此停止。
  • 或者,如果第一个元素没有根据“外部”边界检查,那么输出将是 [2, 2] 因为当将零添加到前一个数字时(如果是开始边界 2)我们会到达结尾因此停止。


  • 我显然没有正确理解符号的工作原理,那么 Haskell 是如何评估表达式的呢?

    最佳答案

    该符号旨在模仿编写简单序列数学的常用方法。第二个元素不是步骤,而是列表的实际第二个元素。其余部分从那里线性外推。例子:

    [1,2..10] = [1,2,3,4,5,6,7,8,9,10]
    [1,3..10] = [1,3,5,7,9]
    [4,3..0]  = [4,3,2,1,0]
    [0,5..]   = [0,5,10,15,20,25,30,35...  -- infinite
    [1,1..]   = [1,1,1,1,1,1,1,1,1,1,1...  -- infinite
    

    原因[2,2..2]是无限的,因为列表中没有任何值大于右端点,即终止条件。如果你希望步长为 2,你应该写 [2,4..2] ,它给出了预期的输出 [2] . (所以我猜这不是所有情况下列表的实际第二个元素,但你会看到逻辑)

    关于list - Haskell 范围表示法生成列表。意外输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5012185/

    相关文章:

    java - Mockito 使用更改的列表进行验证

    haskell - 如何从 Haskell 中的文本 block 中提取关键字

    Haskell 范围和 float

    Haskell:表达式 [0, 0.1 .. 1] 的意外输出

    python - 如何计算列表中元素的数量?

    python - 使用 Django QuerySets 时使用列表理解而不是 for 循环

    python - 初学者不确定如何在抓取时加入列表

    haskell - ghc armv7 二进制 + cabal ?非法指令

    haskell - Cabal ExitFailure 127 是什么意思?