Haskell 在哈斯克尔,射程[';a';.]停在哪里?

Haskell 在哈斯克尔,射程[';a';.]停在哪里?,haskell,Haskell,我学哈斯克尔是为了好玩,跟在后面。使用[1..]时,数字的范围可以无限大。对于字符,范围在哪里停止?我有点假设Unicode表的最后一个字符,但我真的对Haskell一无所知,所以只是问问而已 如果您想知道范围的终点,只需获取最后一项 ghci> last ['a'.. ] '\1114111' 另一种方法:Char是有界类型,即定义了最小值和最大值的类型。Bounded类中的类型提供一个maxBound值。由于maxBound是多态的,因此必须明确说明要查找的值的类型 ghci>

我学哈斯克尔是为了好玩,跟在后面。使用
[1..]
时,数字的范围可以无限大。对于字符,范围在哪里停止?我有点假设Unicode表的最后一个字符,但我真的对Haskell一无所知,所以只是问问而已

如果您想知道范围的终点,只需获取最后一项

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

ghci> maxBound :: Char
'\1114111'
ghci> maxBound :: Int
9223372036854775807
Integer
没有
maxBound
,因为它们是无界的

说明了
['a'..]
maxBound
之间的连接。符号
['a'..]
是a中
枚举的语法糖;这里的
enumFrom
Enum
类型类的一个方法。
Enum
的文档规定,当类型也是
Bounded
的实例时,
enumFrom x
应等同于
enumFromTo x maxBound
,或者更通俗地说,
[x..]=[x..maxBound]
。所以
['a'..]
的最后一个元素必须与
maxBound::Char
相同

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

来自:

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


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

因此您认为在这里提问比在
GHCI
中尝试要好?使用
[False..]
更容易看到,它的计算结果仅为
[False,True]
@БМММППММ1049МА1051;МБССССССССС,我刚刚看到一个永无止境的\45651序列,看起来像Unicode字符代码。这就是我问的原因。如果foo是枚举,[foo..]符号是有效的。Bool和Char都声明了一个Enum实例。它停在
last['a'…]
对我来说有点技术性,因为我还没有研究Haskell的类型系统,但这是一个非常好的答案。谢谢呃,\1114111是最后一个“字符thingy”。(因为“字符”通常是一个模棱两可的术语,所以请不要使用引号;更正确的是类似于“Unicode标量值”的词语。)@R.MartinhoFernandes,同意。事实上,它们被称为FWIW,唯一具有下限(0xFFFF)的版本是Unicode 1.0,它在17年前就不再流行了。所有其他的都有相同的限制:0x10FFFF.@R.MartinhoFernandes:虽然每个平面中的最后两个码点是永久未分配的,所以我猜最大可能的可分配码点是U+10FFFD。(不确定这是否有区别……)最后一个['a'…]
很聪明,我没想过。我已经在ghci中测试了它,并预计它会很长,因为
length['a'…]
是1114015。但这是瞬间的。我的理解是Haskell很懒惰,所以它必须评估整个列表才能找到最后一个。对于
最后一个['a'…]
是真的吗?如果是,它怎么会这么快呢?
maxBound
(相反的是
minBound
)表示
Bounded
类中类型的最大值-定义了最大值和最小值的类型。由于它是多态的,所以您必须明确说明您要查找的值的类型(例如,
Int
的最大值是
maxBound::Int
)@DjebbZ即使它确实计算了整个列表,数到十亿对现代cpu来说也不是一项繁重的任务。@DjebbZ:the解释了
['a']之间的联系
maxBound
。符号
['a'..]
是a中
枚举的语法糖;这里的
enumFrom
Enum
类型类的一个方法。
Enum
的文档规定,当类型也是
Bounded
的实例时,
enumFrom x
应等同于
enumFromTo x maxBound
,或者更通俗地说,
[x..]=[x..maxBound]
。因此,
['a'…]
的最后一个元素必须与
maxBound::Char
@DjebbZ一样慢,就像“不要把它放在一个循环中”,就像“引起一个让人烦恼的延迟”。在前一种意义上“慢”的东西的负载足够快,可以做一小部分固定的次数(比如一次)不会造成明显的延误。因此,贾斯汀和李尔尼都是对的,因为“慢”的定义不同。