为什么Char有一个Bounded实例?

时间:2013-11-16 16:10:11

标签: haskell

为什么maxBoundChar?如果Char是字符,那么为什么用数字来解释它,如果它不是数字,那是什么意思?

> maxBound :: Char
'\1114111'

4 个答案:

答案 0 :(得分:17)

所有角色,就像计算机中的所有东西一样,最终只是数字。 Char代表unicode characters,代表数字。您可以使用CharIntordchr值之间进行转换。例如。 a的unicode值为97,因此ord 'a'97chr 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'