我在一次讲座中遇到了一个练习,这让我对 [2, 2 .. 2] 的输出感到困惑。为什么在输入 [2, 2 .. 2] 时会生成一个带有 2 的“无限”列表。
我理解该符号的方式是第一个元素是开始界限,第二个元素是数字之间的“间隙”,最后一个是列表的结尾,换句话说,当达到该数字时停止。
如果我的推理是正确的,为什么表达式 [2, 2 .. 2] 不输出 [2]?。
我认为 Haskell 可能会这样评估它。
它等于的列表
最后,因此停止。
我显然没有正确理解符号的工作原理,那么 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/