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节中定义了进一步的等价字符。