30

我学习 Haskell 是为了好玩,跟随Learn you a Haskell。使用 时,范围可以用数字达到无穷大[1..]。对于字符,范围在哪里['a'..]停止?我有点假设 Unicode 表的最后一个字符,但我对 Haskell 真的一无所知,所以只是问!

4

2 回答 2

56

如果您想知道范围停止的位置,只需获取最后一项......</p>

ghci> last ['a'.. ]
'\1114111'

另一种方法:Char是有界类型,即定义了最小值和最大值的类型。类中的Bounded类型提供一个maxBound值。由于maxBound是多态的,因此您必须明确说明您要查找的值的类型。

ghci> maxBound :: Char
'\1114111'
ghci> maxBound :: Int
9223372036854775807

因为它们是无界的,所以没有maxBoundfor 。Integer

Haskell 前奏解释了 和 之间['a'..]的联系maxBound。该符号['a'..]是 ; 的语法糖enumFrom a。这enumFromEnum类型类的一个方法。的文档Enum指定当类型也是 的实例时BoundedenumFrom x应等效于enumFromTo x maxBound,或更易读,[x..] = [x..maxBound]。所以 的最后一个元素['a'..]必须与 相同maxBound :: Char

last ['a'.. ]确实会遍历列表,但现代计算机可以在眨眼之间数到一百万。这不是你想要放在一个紧密循环中的东西,但作为你只运行一次的东西,它并不是一个很大的负担。如果您在优化程度较低的实现中尝试它,例如 Hugs 而不是 GHC,您可能需要等待结果。相比之下last [0..],大约需要永远。

于 2013-09-09T12:31:08.120 回答
39

来自2010 年的 Haskell 报告

字符类型 Char 是一个枚举,其值表示 Unicode 字符。Char 类型是 Read、Show、Eq、Ord、Enum 和 Bounded 类的实例。

所以理论上,这个范围应该停在Unicode 标准中定义的最后一个字符处(尽管没有说明是哪个版本)。实际上,您的 Haskell 实现可能会有所不同,例如 GHCI 7.6.2 停止在 \1114111。

于 2013-09-09T12:31:33.783 回答