Haskell 2010语言报告说:
Haskell使用Unicode [2]字符集。但是,源程序目前偏向于早期版本的Haskell中使用的ASCII字符集。
这是否意味着UTF-8?
在ghc-7.0.4 / compiler / parser / Lexer.x.source:
中$unispace = \x05 -- Trick Alex into handling Unicode. See alexGetChar.
$whitechar = [\ \n\r\f\v $unispace]
$white_no_nl = $whitechar # \n
$tab = \t
$ascdigit = 0-9
$unidigit = \x03 -- Trick Alex into handling Unicode. See alexGetChar.
$decdigit = $ascdigit -- for now, should really be $digit (ToDo)
$digit = [$ascdigit $unidigit]
$special = [\(\)\,\;\[\]\`\{\}]
$ascsymbol = [\!\#\$\%\&\*\+\.\/\<\=\>\?\@\\\^\|\-\~]
$unisymbol = \x04 -- Trick Alex into handling Unicode. See alexGetChar.
$symbol = [$ascsymbol $unisymbol] # [$special \_\:\"\']
$unilarge = \x01 -- Trick Alex into handling Unicode. See alexGetChar.
$asclarge = [A-Z]
$large = [$asclarge $unilarge]
$unismall = \x02 -- Trick Alex into handling Unicode. See alexGetChar.
$ascsmall = [a-z]
$small = [$ascsmall $unismall \_]
$unigraphic = \x06 -- Trick Alex into handling Unicode. See alexGetChar.
$graphic = [$small $large $symbol $digit $special $unigraphic \:\"\']
......我不知道该怎么做。 alexGetChar
并没有真正帮助。
答案 0 :(得分:7)
有a proposal标准化UTF-8作为Haskell源文件的标准编码,但我不确定它是否被接受。
实际上,GHC假定所有输入文件都是UTF-8,但它忽略了注释中格式错误的字节序列。
答案 1 :(得分:6)
Unicode是字符集。 UTF-8,UTF-16等是Unicode代码点的具体物理编码。尝试阅读here。差异很好地解释了。
引用报告的部分只是声明Haskell源使用Unicode字符集。它没有说明应该使用哪种编码。换句话说,它说明哪些字符可以出现在源代码中,但没有说明如何用普通字节写出它们。
答案 2 :(得分:1)
虽然Haskell标准简单地说Unicode可能的字符集(而不是例如ASCII或Latin-1)但它没有指定使用几种不同编码中的哪一种(UTF8 UTF16,UTF32,字节顺序)
Alex,Haskell平台附带的词法分析器要求其输入为UTF8编码 * ,这就是为什么你会看到你提到的代码。在实践中,我认为Haskell的所有主要实现都要求源为UTF8。
* - 这实际上是一个真正的问题,因为GHC存储字符串,更重要的是Data.Text
内部为UTF16。能够直接学习这些而不是来回转换会很好。
答案 3 :(得分:0)
数据类型(即可以使用哪些“抽象”数据)与其表示形式(即如何存储在计算机内存或磁盘中)之间存在重要区别。
Haskell报告说了与Unicode有关的两件事:
Haskell中的Char
数据类型表示一个Unicode字符(也称为代码点)。您应该将其视为提供特定接口的抽象数据类型(例如,可以在其上调用isDigit
或toLower
),但是您不知道其在内部的确切表示方式。 Haskell的具体实现(例如GHC)可以随意以所需的任何方式在内存中表示,而且这无关紧要,因为您始终无法访问基础原始位。
Haskell程序是文本,由(抽象的)Unicode代码点组成,即实质上是String
。然后继续说明如何解析此String
。再次强调,必须根据抽象Unicode代码点的序列定义Haskell的语法。
现在,关于您的Haskell源代码问题。 Haskell报告未指定将Unicode文本存储在文件中时如何将其编码为零和一。
实际上,Haskell报告根本没有指定Haskell程序的存储方式!更不用说Haskell源代码存储在文件中了,文件必须以模块命名,目录结构应该遵循模块名称的结构-所有这些都被认为是编译器实现的细节,其思想是这样一来,每个编译器都可以将Haskell程序存储在任何地方,无论它们想要存储在哪里:在文件中,在数据库表中,如用粉笔在上面写有程序的jpeg照片的黑板。因此,它也没有指定编码(为黑板上写出的程序指定编码是没有意义的。)
但是,事实上的标准Haskell编译器GHC假定Haskell程序存储在以UTF-8编码的文件中,按层次进行组织并以模块名称命名。