Haskell 中转义的符号是什么意思?

What does an escaped ampersand mean in Haskell?

我查看了 Haskell 2010 报告并注意到一个奇怪的转义序列和符号:\&。我找不到这个转义序列代表什么的解释。它也可能只位于字符串中。我在 GHCi 中尝试了 print "\&",它打印了一个空字符串。

它转义了……没有字符。 "break" 一些转义序列很有用。例如 我们可能希望将 "" ++ "3" 表示为单个字符串文字。如果我们尝试明显的方法,我们得到

"3" ==> "{"

但是我们可以使用

"\&3"

达到预期结果。

此外,"\SOH""\SO" 都是有效的单个 ASCII 字符转义,使得 "\SO" ++ "H" 难以表达为单个文字:为此我们需要 "\SO\&H"

这个转义技巧也被标准 Show String 实例所利用,它必须产生有效的文字语法。我们可以在 GHCi 中看到这一点:

> "0" ++ "0"
"0\&0"
> "\SO" ++ "H"
"\SO\&H"

此外,这极大地帮助了旨在生成 Haskell 代码(例如元编程)的外部程序。当为字符串文字发出字符时,外部程序可以在可能有歧义的转义符(甚至所有转义符)的末尾添加 \& ,这样程序就不必处理不需要的交互。例如。如果程序现在想发出 </code>,它可以发出 <code>\& 并且可以自由发出任何作为下一个字符。否则,程序应该记住,当发出下一个字符时,如果它是数字,则必须在前面加上 \&。总是添加 \& 更简单,即使不需要:\&A 是合法的,并且与 A.

具有相同的含义

最后,引自 Haskell 报告,解释 \&:

2.6 Character and String Literals

[...]

Consistent with the "maximal munch" rule, numeric escape characters in strings consist of all consecutive digits and may be of arbitrary length. Similarly, the one ambiguous ASCII escape code, "\SOH", is parsed as a string of length 1. The escape character \& is provided as a "null character" to allow strings such as "7\&9" and "\SO\&H" to be constructed (both of length two). Thus "\&" is equivalent to "" and the character '\&' is disallowed. Further equivalences of characters are defined in Section 6.1.2.