在Haskell中,范围['a'..]停止在哪里?

Dje*_*bbZ 30 haskell

在学习Haskell后,我正在学习Haskell.使用时,范围可以通过数字变为无穷大[1..].对于字符,范围在哪里['a'..]停止?我假设Unicode表的最后一个字符,但我真的对Haskell一无所知,所以只是问!

w.b*_*w.b 56

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

ghci> last ['a'.. ]
'\1114111'
Run Code Online (Sandbox Code Playgroud)

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

ghci> maxBound :: Char
'\1114111'
ghci> maxBound :: Int
9223372036854775807
Run Code Online (Sandbox Code Playgroud)

因为它们是无界的maxBound,Integer所以没有.

哈斯克尔前奏解释之间的连接['a'..]maxBound.符号['a'..]是语法糖enumFrom a; 这enumFromEnum类型类的方法.文档Enum指定当类型也是一个实例时Bounded,enumFrom x应该等同于enumFromTo x maxBound或者更可读[x..] = [x..maxBound].所以最后一个元素['a'..]必须与之相同maxBound :: Char.

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

  • `last ['a'..]`很聪明,我没想过.我已经在ghci中对它进行了测试并期望它很长,因为`length ['a'..]`是1114015.但它是瞬间完成的.我的理解是Haskell很懒,所以它必须评估整个列表才能找到最后一个.对于'last ['a'..]`这是真的吗?如果是的话,怎么这么快? (8认同)
  • `maxBound`(相反的是`minBound`)表示"Bounded"类中类型的最大值 - 定义了最大值和最小值的类型.由于它是多态的,你必须明确说明你正在寻找的值的类型(例如`Int`的最大值是`maxBound :: Int`) (7认同)
  • @DjebbZ:[Haskell前奏](http://www.haskell.org/ghc/docs/latest/html/libraries/base/Prelude.html#t:Enum)解释了`['a'...之间的联系. ]`和`maxBound`.符号`['a'..]`是`enumFrom a`的语法糖; 这里`enumFrom`是`Enum`类的一个方法.'Enum`的文档指定当类型也是`Bounded`的实例时,`enumFrom x`应该等同于'enumFromTo x maxBound`,或者更可读,`[x ..] = [x..maxBound ]`.所以`['a'..]`*的最后一个元素必须*与`maxBound :: Char`相同. (7认同)
  • @DjebbZ即使它确实评估了整个列表,数十亿也不是现代cpu的繁重任务. (2认同)

thS*_*oft 39

来自2010年Haskell报告:

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

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

  • @ R.MartinhoFernandes,同意.实际上它们被称为["Unicode代码点"](http://en.wikipedia.org/wiki/Code_point) (7认同)
  • 嗯,\ 1114111*是*最后一个"角色的东西".(因为'字符'通常是一个含糊不清的术语而引用引号;更正确的是'Unicode标量值') (4认同)