简单的是/否haskell列表问题

时间:2009-12-26 15:23:37

标签: list haskell

所以我正在阅读http://learnyouahaskell.com/starting-out,因为它解释了列表,并在Vista 64上使用了ghci。它说[2,4..20]从4到20逐步增加2。这是有效的。它说[20,19..1]从20变为1,但没有解释。我认为第一个数字不是步骤,步骤是第一个和第二个数字之间的差异。这由[4,4..20]确认挂起(没有错误消息,必须杀死控制台)。这与运营商不同!!和take检查索引的范围并给出错误消息。

我的问题是:这是Vista端口上的错误还是应该是这样的?

5 个答案:

答案 0 :(得分:9)

[x,y..z]确实通过步骤y-x从x步进到z。当y-x为0时,这将导致无限列表。这是预期的行为。

请注意,如果您在take 20 [2,2..20]这样的表达式中使用列表,ghci将不会尝试打印整个列表(当然这对于无限列表来说是不可能的)并且它不会“挂起”。< / p>

答案 1 :(得分:5)

引用this book

  

[n,p..m]是从n到m的数字列表,步长为p-n。

你的列表[4,4..20]“挂起”,因为你有一个4-4 = 0的步骤,所以这是一个只包含数字4的无限列表([4,4,4,4 .. 。])。

答案 2 :(得分:3)

Haskell允许无限列表,因为Haskell是“惰性评估语言”,这意味着它只会计算为您提供结果所需的内容,因此Haskell中允许使用无限结构。

在Haskell中你可以计算类似“head [1 ..]”的东西。这是因为Haskell只计算结果所需的内容。因此,在上面的示例中,它将仅生成无限列表的第一个元素(数字1),并且head将返回此元素(数字1)。 所以,在这种情况下,程序将终止!但是,如果计算[1 ..](无限列表)程序将不会终止。同样适用于您的示例,您创建了一个无限列表,并且无法终止它。

答案 3 :(得分:2)

该语法基本上来自列出整个列表。例如,可以通过简单地省略明显的部分来缩短[1,3,5,7,9,11,13,15,17,19]。所以你可以说,如果我指定前两个元素,很明显它会如何继续。所以上面的列表等于[1,3..19]

答案 4 :(得分:2)

值得注意的是,列表中的..语法对enum类型类给出的enumFrom函数有所了解:

http://hackage.haskell.org/packages/archive/base/latest/doc/html/Prelude.html#t:Enum