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