Я посмотрел отчет на Haskell 2010 и заметил странную последовательность с амперсандом: \&. Я не мог найти объяснения, что должна означать эта escape-последовательность. Он также может быть расположен только в строках. Я попытался print "\&" в GHCi, и он печатает пустую строку.
Что означает сбежавший амперсанд в Хаскеле?
Ответ 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.