Haskell源代码编码



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相关的两件事:

  1. Haskell中的Char数据类型表示Unicode字符(也称为代码点(。您应该将其视为一种提供特定接口的抽象数据类型(例如,您可以在其上调用isDigittoLower(,但不允许知道它在内部的具体表示方式。Haskell的具体实现(例如GHC(可以自由地在内存中以任何方式表示它,这根本无关紧要,因为你无论如何都无法访问底层的原始位。

  2. Haskell程序是文本,由(抽象的(Unicode代码点组成,本质上是String。然后解释如何解析这个String。同样,需要强调的是,它根据抽象Unicode代码点的序列定义了Haskell的语法。

现在,回答您关于Haskell源代码的问题。Haskell报告没有指定存储在文件中时如何将此Unicode文本编码为零和一。

事实上,Haskell Report根本没有指定Haskell程序的存储方式!它没有提到Haskell源代码存储在文件中,文件必须以模块命名,目录结构应该遵循模块名称的结构——这些都被认为是编译器实现的细节,其想法是,这允许每个编译器在任何地方以任何方式存储Haskell程序:在文件中、在数据库表中,用jpeg格式的黑板照片,上面用粉笔写着一个程序。因此,它也没有指定编码(为黑板上写的程序指定编码是没有意义的😕).

然而,事实上的标准Haskell编译器GHC假设Haskell程序存储在编码为UTF-8的文件中,按层次结构组织,并以模块名称命名。

最新更新