范围

使用范围表示法创建从 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 类型类的类型。给定一些可枚举的变量 abc,范围语法相当于调用这些 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 解析为 .)。