在学习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; 这enumFrom是Enum类型类的方法.文档Enum指定当类型也是一个实例时Bounded,enumFrom x应该等同于enumFromTo x maxBound或者更可读[x..] = [x..maxBound].所以最后一个元素['a'..]必须与之相同maxBound :: Char.
last ['a'.. ]确实在列表上进行迭代,但现代计算机可以在一个眨眼间数到一百万.这不是你想要在紧密循环中放置的东西,而是你只运行一次并不是一个很大的负担.如果你在一个不太优化的实现中尝试它,比如Hugs而不是GHC,你可能需要等待结果.相比之下last [0..]大约需要永远.
thS*_*oft 39
字符类型Char是一个枚举,其值表示Unicode字符.Type Char是Read,Show,Eq,Ord,Enum和Bounded类的实例.
所以从理论上讲,这个范围应该停在Unicode标准中定义的最后一个字符处(尽管没有说明哪个版本).在实践中,您的Haskell实现可能会有所不同,例如GHCI 7.6.2在\ 1114111处停止.