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

时间:2019-07-09 22:45:33

标签: haskell syntax escaping lexer

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

1 个答案:

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