Что означает сбежавший амперсанд в Хаскеле? - PullRequest
35 голосов
/ 10 июля 2019

Я посмотрел отчет Haskell 2010 и заметил странную последовательность с амперсандом: \&. Я не мог найти объяснения, что должна означать эта escape-последовательность. Он также может быть расположен только в строках. Я попытался print "\&" в GHCi, и он печатает пустую строку.

1 Ответ

43 голосов
/ 10 июля 2019

Это ускользает ... без персонажа. Полезно «сломать» некоторые 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.

...