Haskell Char和unicode代理人

时间:2014-02-03 05:04:41

标签: haskell unicode

我正在玩字符串并发现Haskell(正确)不允许Unicode代码点0x10ffff之上的字符(即如果尝试使用超出此限制的某个字符,则会出现类似于序列超出范围错误的内容)。出于好奇,我使用Unicode代理一半(0xd800到0xdfff) - 无效的Unicode代码点,并发现它们似乎被允许。我很好奇为什么会这样。这仅仅是因为作为一个有界项目意味着只定义一个最大值和一个最小值?

1 个答案:

答案 0 :(得分:2)

禁止代理代码单元确实会使Char成为Unicode代码点更正确的类型。报告称Char是“一个枚举,其值代表Unicode字符”,所以可能这应该被视为GHC错误。

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

我不知道它有一个特别好的理由,或者甚至考虑到最初的权衡。在Haskell 1.4中,Char只是一个16位类型,因此将其扩展为17 * 2 ^ 16值而不添加额外检查是很自然的。偶尔会出现这个问题 - 我之前提出过这个问题 - 但是大多数人似乎并不担心这个问题。但是,为了进行适当的讨论,提交关于它的GHC错误可能是合理的。

请注意Data.Text(使用UTF-16作为其内部表示)does disallow无效代码单元(必须)。