Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell字符和unicode代理_Haskell_Unicode - Fatal编程技术网

Haskell字符和unicode代理

Haskell字符和unicode代理,haskell,unicode,Haskell,Unicode,我在玩字符串时发现Haskell(正确地)不允许Unicode代码点0x10ffff以上的字符(即,如果试图使用超出此限制的字符,就会出现类似序列超出范围的错误)。出于好奇,我研究了Unicode代理半部分(0xd800到0xdfff)——无效的Unicode代码点,发现它们似乎是允许的。我很好奇为什么会这样。这仅仅是因为作为一个有界项意味着只定义一个最大值和一个最小值吗?不允许代理代码单元确实会使Char成为一种更正确的Unicode代码点类型。报告说Char是“一个枚举,其值代表Unicod

我在玩字符串时发现Haskell(正确地)不允许Unicode代码点0x10ffff以上的字符(即,如果试图使用超出此限制的字符,就会出现类似序列超出范围的错误)。出于好奇,我研究了Unicode代理半部分(0xd800到0xdfff)——无效的Unicode代码点,发现它们似乎是允许的。我很好奇为什么会这样。这仅仅是因为作为一个有界项意味着只定义一个最大值和一个最小值吗?

不允许代理代码单元确实会使
Char
成为一种更正确的Unicode代码点类型。报告说Char是“一个枚举,其值代表Unicode字符”,因此这可能应该被视为GHC错误

“有界项”没有具体的概念,但它需要在不同的地方进行额外的检查(例如,现在
chr
只需要进行一次比较,以检查其参数是否有效),并且可能会使某些事情表现得更奇怪(如果人们间接地期望代码点是连续的)

不过,我不知道有什么特别好的理由,也不知道最初是否考虑过这种权衡。在Haskell 1.4中,
Char
只是一个16位的类型,因此在不添加额外检查的情况下将其扩展到17*2^16值是很自然的。这个问题偶尔会被提出来——我以前也提过——但大多数人似乎并不太担心。不过,为了进行适当的讨论,提交一个GHC bug可能是合理的


请注意,
Data.Text
(它使用UTF-16作为其内部表示)是无效的代码单元(它必须这样做)。

是的,我收集了很多。我所说的有界是指字符的使用受到有界和枚举实例的限制。我正在用Parsec构建一个解析器,我在尝试限制anyChar和oneOf时发现了这一点(在我的项目范围内,有几个有效的unicode代码点是我不允许的)。这不会对我产生任何影响,因为我刚开始使用的是文本流,这只是令人惊讶的发现。@MikeMenzel
Bounded
Enum
都不要求它们的实例是连续的。就
Bounded
而言,“连续”甚至没有确切的含义。只有当您转换为
Int
s或从
Int
s转换时,它才会出现,并在该表示中看到一个孔。