为什么maxBound
为Char
?如果Char
是字符,那么为什么用数字来解释它,如果它不是数字,那是什么意思?
> maxBound :: Char
'\1114111'
答案 0 :(得分:17)
所有角色,就像计算机中的所有东西一样,最终只是数字。 Char
代表unicode characters,代表数字。您可以使用Char
和Int
在ord
和chr
值之间进行转换。例如。 a
的unicode值为97,因此ord 'a'
为97
,chr 97
为'a'
。
Char '\1114111'
是Char
,表示数字1114111
或0x10FFFF,defined为非字符。这是Unicode中定义的最大值,是Haskell支持的最大值:'\1114112'
将导致编译错误。
答案 1 :(得分:4)
字符编码很棘手。在幕后,所有字符都用数字表示。 Unicode标准提供了一组“代码点”,它们只是映射到特定真实字符序列的数字。 Unicode定义0到1114111之间的代码点,这是您在尝试maxBound
时看到的内容。
Char
将Unicode代码点编码为单个整数,这有点效率低下。如果您想要有效的编码,请使用Text
。
您看到显示\1114111
因为这是maxBound :: Char
所代表的代码点,并且没有更有效,更有意义的方式来显示它。特别是,它位于Unicode标准的“Supplementary Private Use Area-B”中,这意味着它保留在Unicode范围之外使用,因此没有标准含义。
答案 2 :(得分:1)
Char
数据类型表示Unicode值。这些值作为数字存储在计算机中,每个数字作为屏幕上的特定表示。对于Char
,最小值为0
,最大值为1114111
。
一个更简单的例子是C,其中char
类型相当于与ASCII字符表对应的7位数字,它们的值可以在0到127之间,尽管我相信在char
中存储整个8位字节是合法的,为您提供0到255的值。
请记住,一切都是计算机的数字。某些数据类型具有可以排序且有限的表示,因此它们具有最小值和最大值。
Haskell中没有最小值或最大值的数据类型的示例是Integer
,因为只要您有足够的RAM可用,它就可以表示任何整数值。
答案 3 :(得分:0)
查看Bounded Char
实例本身的来源很有帮助。字符实际上是带有表示的数字,边界表示Unicode代码点的边界。
instance Bounded Char where
minBound = '\0'
maxBound = '\xffff'