-
MultiWayIf -
- Since:
-
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 -> ...