我学习 Haskell 是为了好玩,跟随Learn you a Haskell。使用 时,范围可以用数字达到无穷大[1..]
。对于字符,范围在哪里['a'..]
停止?我有点假设 Unicode 表的最后一个字符,但我对 Haskell 真的一无所知,所以只是问!
2 回答
如果您想知道范围停止的位置,只需获取最后一项......</p>
ghci> last ['a'.. ]
'\1114111'
另一种方法:Char
是有界类型,即定义了最小值和最大值的类型。类中的Bounded
类型提供一个maxBound
值。由于maxBound
是多态的,因此您必须明确说明您要查找的值的类型。
ghci> maxBound :: Char
'\1114111'
ghci> maxBound :: Int
9223372036854775807
因为它们是无界的,所以没有maxBound
for 。Integer
Haskell 前奏解释了 和 之间['a'..]
的联系maxBound
。该符号['a'..]
是 ; 的语法糖enumFrom a
。这enumFrom
是Enum
类型类的一个方法。的文档Enum
指定当类型也是 的实例时Bounded
,enumFrom x
应等效于enumFromTo x maxBound
,或更易读,[x..] = [x..maxBound]
。所以 的最后一个元素['a'..]
必须与 相同maxBound :: Char
。
last ['a'.. ]
确实会遍历列表,但现代计算机可以在眨眼之间数到一百万。这不是你想要放在一个紧密循环中的东西,但作为你只运行一次的东西,它并不是一个很大的负担。如果您在优化程度较低的实现中尝试它,例如 Hugs 而不是 GHC,您可能需要等待结果。相比之下last [0..]
,大约需要永远。
字符类型 Char 是一个枚举,其值表示 Unicode 字符。Char 类型是 Read、Show、Eq、Ord、Enum 和 Bounded 类的实例。
所以理论上,这个范围应该停在Unicode 标准中定义的最后一个字符处(尽管没有说明是哪个版本)。实际上,您的 Haskell 实现可能会有所不同,例如 GHCI 7.6.2 停止在 \1114111。