Ответ 1
Да, гарантируется, что оценка выражения both (False, undefined)
не будет расходиться, так как согласование по конструкторам данных гарантируется совпадением слева направо против компонентов конструктора, и шаблон завершается с ошибкой, как только некоторые поднабора, Поскольку первый элемент кортежа False
, шаблон будет терпеть неудачу для обеих ветвей (True, ...)
, как только первый элемент не будет соответствовать.
В Отчет Haskell 2010, раздел 3.17.2, который дает неформальную семантику соответствия шаблонов:
- Соответствие шаблону 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 имеет отношение к вопросу).