逃逸的“&”号在Haskell中意味着什么?

Nol*_*lan 36 syntax haskell escaping lexer

我查看了Haskell 2010报告,发现一个带有&符号的奇怪的转义序列:\&。我找不到解释此转义序列代表什么。它也可能仅位于字符串中。我print "\&"在GHCi中尝试过,它会打印一个空字符串。

chi*_*chi 43

它逃脱了...没有字符。“中断”某些转义序列很有用。例如,我们可能要表示"\12" ++ "3"为单个字符串文字。如果我们尝试明显的方法,我们会得到

"\123" ==> "{"
Run Code Online (Sandbox Code Playgroud)

但是我们可以使用

"\12\&3"
Run Code Online (Sandbox Code Playgroud)

为预期的结果。

而且,"\SOH""\SO"都是有效的单个ASCII字符转义符,"\SO" ++ "H"很难将其表示为单个文字:我们需要这样做"\SO\&H"

标准Show String实例还利用了这种转义手段,该实例必须产生有效的文字语法。我们可以在GHCi中看到这一点:

> "\140" ++ "0"
"\140\&0"
> "\SO" ++ "H"
"\SO\&H"
Run Code Online (Sandbox Code Playgroud)

此外,这极大地帮助了旨在生成Haskell代码的外部程序(例如,用于元编程)。当为字符串文字发射字符时,外部程序可以\&在潜在的模棱两可的转义符(甚至所有转义符)的末尾添加,这样程序就不必处理不必要的交互。例如,如果程序要立即发出\12,则可以发出\12\&并自由发出任何内容作为下一个字符。否则,程序应记住,发出下一个字符时,必须在其前面加上\&数字。\&即使不需要,也总是比较容易添加:\12\&A是合法的,并且与的含义相同\12A

最后,引用Haskell报告中的一段话,解释\&如下:

2.6字符和字符串文字

[...]

与“最大字符数”规则一致,字符串中的数字转义字符由所有连续数字组成,并且可以具有任意长度。类似地,一个不明确的ASCII转义码"\SOH"解析为长度为1的字符串。转义字符\&提供为,"null character"以允许构造诸如"\137\&9"和的字符串"\SO\&H"(长度均为2)。因此"\&"等于""和字符'\&'是不允许的。在6.1.2节中定义了进一步的等价字符。

  • 它也等于* gap *的零宽度:反斜杠后跟一些空格,并且从字符串中剥离了另一个反斜杠,以允许多行字符串文字,但是在中间没有空格的情况下,只给出了一个反斜杠。我发现帮助语法高亮显示在字符串结尾处的间隙上很有用,因为文字以'\“`结尾,但这不是转义的引号。 (6认同)