Haskell源编码

时间:2011-07-23 02:39:14

标签: haskell encoding

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并没有真正帮助。

4 个答案:

答案 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有关的两件事:

  1. Haskell中的Char数据类型表示一个Unicode字符(也称为代码点)。您应该将其视为提供特定接口的抽象数据类型(例如,可以在其上调用isDigittoLower),但是您不知道其在内部的确切表示方式。 Haskell的具体实现(例如GHC)可以随意以所需的任何方式在内存中表示,而且这无关紧要,因为您始终无法访问基础原始位。

  2. Haskell程序是文本,由(抽象的)Unicode代码点组成,即实质上是String。然后继续说明如何解析此String。再次强调,必须根据抽象Unicode代码点的序列定义Haskell的语法。

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

实际上,Haskell报告根本没有指定Haskell程序的存储方式!更不用说Haskell源代码存储在文件中了,文件必须以模块命名,目录结构应该遵循模块名称的结构-所有这些都被认为是编译器实现的细节,其思想是这样一来,每个编译器都可以将Haskell程序存储在任何地方,无论它们想要存储在哪里:在文件中,在数据库表中,如用粉笔在上面写有程序的jpeg照片的黑板。因此,它也没有指定编码(为黑板上写出的程序指定编码是没有意义的。)

但是,事实上的标准Haskell编译器GHC假定Haskell程序存储在以UTF-8编码的文件中,按层次进行组织并以模块名称命名。