Что означает сбежавший амперсанд в Хаскеле?

Я посмотрел отчет на 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.