-
MultiWayIf -
- Начиная с:
-
7.6.1
Разрешает использовать синтаксис многоальтернативного-
if.
С расширением MultiWayIf GHC принимает условные выражения с несколькими ветвями:
if | guard1 -> expr1 | ... | guardN -> exprN
что примерно эквивалентно
case () of _ | guard1 -> expr1 ... _ | guardN -> exprN
Многоальтернативные if-выражения вводят новый контекст компоновки. Поэтому приведённый выше пример эквивалентен:
if { | guard1 -> expr1
; | ...
; | guardN -> exprN
}
Следующий пример работает ожидаемым образом:
if | guard1 -> if | guard2 -> expr2
| guard3 -> expr3
| guard4 -> expr4
поскольку компоновка преобразует его в
if { | guard1 -> if { | guard2 -> expr2
; | guard3 -> expr3
}
; | guard4 -> expr4
}
Компоновка многоальтернативных if работает так же, как и в других контекстах компоновки, за исключением того, что точки с запятой между защитами в многоальтернативном if необязательны. Поэтому нет необходимости выравнивать все защиты по одному столбцу; это соответствует тому, как работают защиты в определениях функций и выражениях case.
Обратите внимание, что многоальтернативные if поддерживают не только булевы условия в качестве защит:
if | parseNumbers settings , Just (exponent, mantissa) <- decomposeNumber str , let (integralPart, fractionPart) = parse mantissa , integralPart >= 0 -> ... | otherwise -> ...