范围
使用范围表示法创建从 1 到 10 的列表很简单:
[1..10] -- [1,2,3,4,5,6,7,8,9,10]
要指定步骤,请在 start 元素后添加逗号和下一个元素:
[1,3..10] -- [1,3,5,7,9]
请注意,Haskell 始终将步骤作为术语之间的算术差异,并且你不能指定多于前两个元素和上限:
[1,3,5..10] -- error
[1,3,9..20] -- error
要按降序生成范围,请始终指定否定步骤:
[5..1] -- []
[5,4..1] -- [5,4,3,2,1]
因为 Haskell 是非严格的,所以只有在需要时才会评估列表的元素,这允许我们使用无限列表。[1..]
是从 1 开始的无限列表。此列表可以绑定到变量或作为函数参数传递:
take 5 [1..] -- returns [1,2,3,4,5] even though [1..] is infinite
使用具有浮点值的范围时要小心,因为它接受溢出超过半增量,以抵御舍入问题:
[1.0,1.5..2.4] -- [1.0,1.5,2.0,2.5] , though 2.5 > 2.4
[1.0,1.1..1.2] -- [1.0,1.1,1.2000000000000002] , though 1.2000000000000002 > 1.2
范围不仅可以使用数字,还可以使用任何实现 Enum
类型类的类型。给定一些可枚举的变量 a
,b
,c
,范围语法相当于调用这些 Enum
方法:
[a..] == enumFrom a
[a..c] == enumFromTo a c
[a,b..] == enumFromThen a b
[a,b..c] == enumFromThenTo a b c
例如,使用 Bool
就可以了
[False ..] -- [False,True]
注意 False
之后的空格,以防止将其解析为模块名称限定(即 False..
将从模块 False
解析为 .
)。