我查看了Haskell 2010报告,发现一个奇怪的逃逸序列,带有“&”号:\&
。我找不到解释此转义序列代表什么。它也可能仅位于字符串中。我在GHCi中尝试过print "\&"
,它会打印一个空字符串。
答案 0 :(得分:43)
它逃脱了……没有字符。 “中断”某些转义序列很有用。例如
我们可能希望将"\12" ++ "3"
表示为单个字符串文字。如果尝试明显的方法,我们将得到
"\123" ==> "{"
但是我们可以使用
"\12\&3"
获得预期结果。
此外,"\SOH"
和"\SO"
都是有效的单个ASCII字符转义符,使"\SO" ++ "H"
难以表达为单个文字:为此,我们需要"\SO\&H"
。
标准Show String
实例也利用了这种转义手段,该实例必须产生有效的文字语法。我们可以在GHCi中看到这一点:
> "\140" ++ "0"
"\140\&0"
> "\SO" ++ "H"
"\SO\&H"
此外,这极大地帮助了旨在生成Haskell代码的外部程序(例如用于元编程)。当为字符串文字发射字符时,外部程序可以在可能含糊的转义符(甚至所有转义符)的末尾添加\&
,这样程序就不必处理不必要的交互。例如。如果程序现在要发出\12
,则可以发出\12\&
并可以自由发出任何内容作为下一个字符。否则,程序应记住,发出下一个字符时,如果是数字,则必须以\&
开头。即使不需要,也总是添加\&
较为简单:\12\&A
是合法的,并且与\12A
的含义相同。
最后,Haskell报告中的一句话引述了\&
:
2.6字符和字符串文字
[...]
与“最大蒙克”规则一致,字符串中的数字转义字符由所有连续数字组成,并且可以具有任意长度。同样,一个模糊的ASCII转义码
"\SOH"
被解析为长度为1的字符串。转义字符\&
被提供为"null character"
,以允许诸如{{1} }和"\137\&9"
都将被构造(均为长度2)。因此"\SO\&H"
等效于"\&"
,并且字符""
被禁止。在第6.1.2节中定义了进一步的等价字符。