В чем разница между MultiWayIf и классическими охранниками? - PullRequest
0 голосов
/ 13 февраля 2019

Что предлагает расширение MultiWayIf, которое нельзя сделать с помощью | охранников и наоборот?

Например, можно написать ту же функцию, что и

f x | x == 0 = -1
    | otherwise = x

или

f x = if | x == 0 -> -1
         | otherwise -> x

Я не вижу никакой разницы между этими двумя примерами, кроме использованного синтаксического сахара.Есть ли ситуации, когда я должен предпочесть одно другому?

Ответы [ 3 ]

0 голосов
/ 13 февраля 2019

Предположим, у вас есть сильно вложенный оператор if, например

if c1 then a1
else if c2 then a2
else if c3 then a3
else if c4 then a4
else if c5 then a5
else a6

MultiWayIf, позволяющий записать это более кратко как

if | c1 -> a1
   | c2 -> a2
   | c3 -> a3 
   | c4 -> a4
   | c5 -> a5
   | otherwise -> a6

Кроме того, в то время как каждое выражение ifдолжен предоставить значение, является ли условие истинным или ложным (if c then a не является действительным выражением if, потому что else отсутствует), многогранный if не должен быть исчерпывающим;otherwise можно опустить.Это только синтаксическая релаксация;исключение будет по-прежнему вызываться после вычисления выражения, если ни одно из условий не выполняется.

0 голосов
/ 13 февраля 2019

Это просто синтаксическое удобство, как объяснили другие.Вы можете легко перевести любое многопоточное if в эквивалентное case выражение.

if
  | c1 -> e1
  | c2 -> e2
  ...

точно эквивалентно

case () of
  _ | c1 -> e1
    | c2 -> e2
    ...

Как обычно, () означает "Нет ничего"чтобы увидеть здесь "пока _ означает", а мы все равно не смотрим ".

0 голосов
/ 13 февраля 2019

Multiway if не должен использоваться вместо функций защиты.Если вы можете использовать охрану, вы должны это сделать.Но многостраничный if также может использоваться в середине выражения, очень похожий на case, например:

f x = "The argument is " ++ 
         if | x > 0 -> "positive"
            | x < 0 -> "negative"
            | otherwise -> "zero"

Лично я нахожу ясность этого конкретного примера довольно сомнительной, но эторазница.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...