Семантика сопоставления с образцом определены в следующем разделе стандарта: Formal Semantics of Pattern Matching.
Шаг, имеющий отношение к вашему вопросу, c. Как вы можете видеть, шаблон совпадает с охранниками вида
case v of { p | g1 -> e1 ; ...
| gn -> en where { decls }
_ -> e' }
пересчитываются в шаблоне сопоставляется без охраны, как:
case e' of
{y ->
case v of {
p -> let { decls } in
if g1 then e1 ... else if gn then en else y ;
_ -> y }}
Так шаблон охранники определены в терминах if
и «проваливаемся» реализуется связывая выражение с переменной и затем повторяя его один раз в предложении else
if
, а затем в шаблоне, к которому вы попали.
Если нет ни одного случая, чтобы упасть до (как в вашем примере) один будет вставлен на стадии б, которая вставляет вариант по умолчанию _ -> error "No match"
Спасибо за ссылку. Я бы хотел, чтобы отметить ветку как шаблон соответствия ошибки, но я могу понять, почему такая функциональность не предлагает язык. Благодаря! – Ozgur