Spec-Zone.ru › Haskell 9

6.2.15. Многоуровневые выражения if

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 -> ...

© 2002–2007 The University Court of the University of Glasgow. All rights reserved.
Licensed under the Glasgow Haskell Compiler License.
https://downloads.haskell.org/~ghc/9.12.1/docs/users_guide/exts/multiway_if.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API