首页 > 解决方案 > Haskell中转义的&符号是什么意思?

问题描述

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

标签: haskellsyntaxescapinglexer

解决方案


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

"\123" ==> "{"

但是我们可以使用

"\12\&3"

为预期的结果。

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

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

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

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

最后,引用 Haskell 报告中的一句话,解释\&

2.6 字符和字符串文字

[...]

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


推荐阅读