Ответ 1
Семантика сопоставления шаблонов определяется в следующем разделе стандарта: Формальная семантика соответствия шаблонов.
Шаг, относящийся к вашему вопросу, - 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
, а "fallthrough" реализуется путем привязки выражения к переменной, а затем повторения его один раз в предложении else
if
, а затем в шаблоне, который вы 'd проваливается.
Если нет случая, чтобы пройти до (как в вашем примере), то будет вставлен шаг b, который вставляет случай по умолчанию _ -> error "No match"