Ответ 1
Это ускользает... без характера. Полезно "сломать" некоторые 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.