使用 ghci 在 Haskell 中使用 [2,2..20] 进行无限循环

lov*_*rde 3 haskell

我只是盯着 Haskell 阅读http://learnyouahaskell.com的书。在 Texas Ranges 部分中,作者展示了使用语法 [x,y..z] 指定范围中的步骤的代码,我在示例 [2,4..20] 中做到了这一点,并且运行顺利,但是当我运行 [2,2..20] 我得到一个无限的 2 列表,而不是 [2,3,4,5,6,7,8,9,10,11,12,13,14,15,16, 17,18,19,20]。如果我运行 [2,3..20] 我会得到所需的输出,所以我假设列表的第一个值为 2 存在某种问题,我想要一个更技术性的答复来解释为什么会这样不允许。控制台图片

Wil*_*sem 12

\n

但是当我跑步时,我得到了一个无限的s[2,2..20]列表2

\n
\n

这是预期的行为。事实上,对于 range ,第一个数字确定起始值,和之间的差值确定步长,并确定上限。由于步长为,它将继续产生s,并且永远不会产生大于上限 的值。[x, y .. z]xyxz0220

\n

如果你写,这会被翻译成Haskell报告 \xc2\xa76.3.4 所说的[e1, e2 .. e3]enumFromThenTo e1 e2 e3

\n
\n

该序列是列表 [ e 1 , e 1 + i , e 1 +2 i ,\xe2\x80\xa6 e 3 ],其中增量ie 2 - e 1。如果增量为正或零,则当下一个元素大于e 3时列表终止;如果e 1 > e 3,则列表为空。如果增量为负,则当下一个元素小于e 3时列表终止;如果e 1 < e 3,则列表为空。enumFromThenTo e1 e2 e3

\n
\n