Это ускользает ... без персонажа. Полезно «сломать» некоторые escape-последовательности. Например
мы можем захотеть выразить "\12" ++ "3"
как однострочный литерал. Если мы попробуем очевидный подход, мы получим
"\123" ==> "{"
Однако мы можем использовать
"\12\&3"
для намеченного результата.
Кроме того, "\SOH"
и "\SO"
являются действительными одиночными символами ASCII, что делает "\SO" ++ "H"
сложным для выражения в виде одного литерала: для этого нам нужно "\SO\&H"
.
Этот escape-трюк также используется стандартным экземпляром Show String
, который должен создавать допустимый буквальный синтаксис. Мы можем увидеть это в действии в GHCi:
> "\140" ++ "0"
"\140\&0"
> "\SO" ++ "H"
"\SO\&H"
Кроме того, это очень помогает внешним программам, которые стремятся генерировать код на Haskell (например, для метапрограммирования). При отправке символов для строкового литерала внешняя программа может добавить \&
в конце потенциально неоднозначных выходов (или даже всех выходов), чтобы программе не приходилось обрабатывать нежелательные взаимодействия. Например. если программа хочет испустить \12
сейчас, она может испустить \12\&
и может свободно испускать что-либо в качестве следующего символа. В противном случае, программа должна помнить, что, когда выдается следующий символ, к нему должен добавляться \&
, если это цифра. Проще всегда добавлять \&
, даже если в этом нет необходимости: \12\&A
допустимо и имеет то же значение, что и \12A
.
Наконец, цитата из отчета на Haskell, поясняющая \&
:
2.6 Символьные и строковые литералы
[...]
В соответствии с правилом "максимального числа", числовые escape-символы в строках состоят из всех последовательных цифр и могут иметь произвольную длину. Точно так же один неоднозначный escape-код ASCII, "\SOH"
, анализируется как строка длины 1. Экранирующий символ \&
предоставляется как "null character"
, что позволяет создавать такие строки, как "\137\&9"
и "\SO\&H"
(оба длины два). Таким образом, "\&"
эквивалентно ""
, а символ '\&'
запрещен. Дальнейшие эквивалентности символов определены в разделе 6.1.2.