在列表上使用范围运算符会导致无限扩展

时间:2014-02-21 21:02:49

标签: haskell

我正在从“了解你的哈斯克尔”中学习Haskell。

我正在查看列表并使用范围构建它们。

如果我有一个像

这样的列表,我会认为是正确的吗?
[2,4..20]

haskell的作用是获取前两个元素之间的差异,然后将其添加到4以获取后续值?

这让我想到了下一点。我尝试了[1,1..20],它导致了一个永无止境的列表扩展,因为1-1 = 0,所以没有算术进展。

我的想法是否正确?

2 个答案:

答案 0 :(得分:7)

Haskell Report是最终参考。这有关于arithmetic sequences

的说法
  

翻译:算术序列满足这些身份:

[ e1.. ]      = enumFrom e1
[ e1,e2.. ]   = enumFromThen e1 e2
[ e1..e3 ]    = enumFromTo e1 e3
[ e1,e2..e3 ] = enumFromThenTo e1 e2 e3
     

其中enumFrom,enumFromThen,enumFromTo和enumFromThenTo是Prelude中定义的类Enum中的类方法(参见图6.1)。

     

算术序列的语义因此完全取决于类型t的实例声明。有关Preum类型在Enum中的详细信息及其语义,请参见第6.3.4节。

因此,我们应该查看相应类型的enumFromThenTo方法。我们假设我们在这里谈论Integer。有关预定义类型和类的章节可以说明Enum instances

  

对于Int和Integer类型,枚举函数具有以下含义:

     
      
  • 序列enumFrom e1是列表[e1,e1 + 1,e1 + 2,...]。
  •   
  • 序列enumFromThen e1 e2是列表[e1,e1 + i,e1 + 2i,...],其中增量i为e2-e1。增量可以是零或负数。如果增量为零,则所有列表元素都相同。
  •   
  • 序列enumFromTo e1 e3是列表[e1,e1 + 1,e1 + 2,... e3]。如果e1>,则列表为空。 E3。
  •   
  • 序列enumFromThenTo e1 e2 e3是列表[e1,e1 + i,e1 + 2i,... e3],其中增量i为e2-e1。如果增量为正或零,则当下一个元素大于e3时,列表终止;如果e1>列表为空E3。如果增量为负,则当下一个元素小于e3时,列表终止;如果e1<列表为空。 E3。
  •   

所以,是的,你所说的是完全正确的。

答案 1 :(得分:2)

这种语法实际上只使用Enum类型类,它实际上与数字或差异无关。如果您有自己的Enum类型,则可以使用列表扩展。代替的是函数

enumFrom :: a -> [a]
enumFromThen :: a -> a -> [a]
enumFromTo :: a -> a -> [a]
enumFromThenTo :: a -> a -> a -> [a]

对于IntInteger类型,您描述的算法基本上就是实现。