我正在从“了解你的哈斯克尔”中学习Haskell。
我正在查看列表并使用范围构建它们。
如果我有一个像
这样的列表,我会认为是正确的吗?[2,4..20]
haskell的作用是获取前两个元素之间的差异,然后将其添加到4以获取后续值?
这让我想到了下一点。我尝试了[1,1..20],它导致了一个永无止境的列表扩展,因为1-1 = 0,所以没有算术进展。
我的想法是否正确?
答案 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]
对于Int
和Integer
类型,您描述的算法基本上就是实现。