Подтвердить что ты не робот

Есть ли какие-либо гарантии относительно порядка оценки в шаблоне?

Следующие

(&&) :: Bool -> Bool -> Bool
False && _ = False
True && False = False
True && True = True

имеет желаемое свойство короткого замыкания False && undefined ≡ False. Первое предложение, которое является нестрогим в правильном аргументе, гарантированно проверяется прежде, чем что-либо еще будет проверено.

По-видимому, он все еще работает, если я изменяю порядок и даже не выполняю функции

both :: (Bool,Bool) -> Bool
both (True,False) = False
both (True, True) = True
both (False, _) = False

Prelude> both (False, undefined)
False

но действительно ли это гарантировано стандартом? В отличие от порядка предложений, порядок оценки шаблонов здесь не столь ясен. Могу ли я быть уверенным, что сопоставление (True,False) будет отменено, как только будет определено (False,_), прежде чем элемент snd будет вообще оценен?

4b9b3361

Ответ 1

Да, гарантируется, что оценка выражения both (False, undefined) не будет расходиться, так как согласование по конструкторам данных гарантируется совпадением слева направо против компонентов конструктора, и шаблон завершается с ошибкой, как только некоторые поднабора, Поскольку первый элемент кортежа False, шаблон будет терпеть неудачу для обеих ветвей (True, ...), как только первый элемент не будет соответствовать.

В Отчет Haskell 2010, раздел 3.17.2, который дает неформальную семантику соответствия шаблонов:

  1. Соответствие шаблону con pat1... patn для значения, где con - конструктор, определенный данными, зависит от значения:
    • Если значение имеет форму con v1... vn, подматрицы сопоставляются слева направо против компонентов значения данных; если все совпадения успешны, общее совпадение выполняется успешно; первый сбой или отклонение приводит к сбою или рассогласованию общего соответствия соответственно.
    • Если значение имеет форму con 'v1... vm, где con - другой конструктор для con', совпадение не выполняется.
    • Если значение ⊥, совпадение отклоняется.

Так как синтаксис кортежа - это особый случай синтаксического сахара для конструктора данных, это применимо.

Для более полного рассмотрения соответствия шаблонов см. раздел 3.17.3 отчета Haskell 2010, в котором дается формальная семантика соответствия шаблонов ( в частности, рисунок 3.2 относится к этому вопросу).

Другим ресурсом, представляющим интерес, является статья Паттерн-редукция в Haskell, которая определяет семантику как интерпретатор (написанный в Haskell) абстрактного синтаксическое представление конкретного синтаксиса Haskell (функция mP на рисунке 3, стр. 7 имеет отношение к вопросу).