Haskell 2010语言报告说:
Haskell使用Unicode[2]字符集。然而,源程序目前偏向于早期版本的Haskell中使用的ASCII字符集。
这是指UTF-8吗?
在ghc-7.0.4/compiler/parser/Lexer.x中来源:
$unispace = x05 -- Trick Alex into handling Unicode. See alexGetChar.
$whitechar = [ nrfv $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
并没有真正的帮助。
有人提议将UTF-8标准化为Haskell源文件的标准编码,但我不确定它是否被接受。
在实践中,GHC假设所有输入文件都是UTF-8,但它忽略了注释中格式错误的字节序列。
Unicode是字符集。UTF-8、UTF-16等是Unicode码点的具体物理编码。试着在这里阅读。差异在那里解释得很好。
引用的报告部分只是指出Haskell源代码使用Unicode字符集。它根本没有说明应该使用哪种编码。换句话说,它说明了哪些字符可以出现在源中,但没有说明如何用纯字节来书写。
虽然Haskell标准只是说Unicode是一组可能的字符(而不是ASCII或Latin-1(,但它没有指定要使用几种不同编码(UTF8、UTF16、UTF32、字节顺序(中的哪种。
Alex,Haskell平台附带的lexer要求其输入是UTF8编码的*,这就是您看到您提到的代码的原因。在实践中,我认为Haskell的所有主要实现都要求源代码使用UTF8。
*-这实际上是一个真正的问题,因为GHC将字符串存储,更重要的是Data.Text
内部存储为UTF16。如果能够直接对这些进行lex处理,而不是来回转换,那就太好了。
数据类型(即可以使用哪些"抽象"数据(和其表示形式(即如何将其存储在计算机内存或磁盘上(之间有一个重要区别。
Haskell报告指出了与Unicode相关的两件事:
-
Haskell中的
Char
数据类型表示Unicode字符(也称为代码点(。您应该将其视为一种提供特定接口的抽象数据类型(例如,您可以在其上调用isDigit
或toLower
(,但不允许知道它在内部的具体表示方式。Haskell的具体实现(例如GHC(可以自由地在内存中以任何方式表示它,这根本无关紧要,因为你无论如何都无法访问底层的原始位。 -
Haskell程序是文本,由(抽象的(Unicode代码点组成,本质上是
String
。然后解释如何解析这个String
。同样,需要强调的是,它根据抽象Unicode代码点的序列定义了Haskell的语法。
现在,回答您关于Haskell源代码的问题。Haskell报告没有指定存储在文件中时如何将此Unicode文本编码为零和一。
事实上,Haskell Report根本没有指定Haskell程序的存储方式!它没有提到Haskell源代码存储在文件中,文件必须以模块命名,目录结构应该遵循模块名称的结构——这些都被认为是编译器实现的细节,其想法是,这允许每个编译器在任何地方以任何方式存储Haskell程序:在文件中、在数据库表中,用jpeg格式的黑板照片,上面用粉笔写着一个程序。因此,它也没有指定编码(为黑板上写的程序指定编码是没有意义的😕).
然而,事实上的标准Haskell编译器GHC假设Haskell程序存储在编码为UTF-8的文件中,按层次结构组织,并以模块名称命名。