Haskell: Multi-way if-выражениям нужно включить MultiWayIf - PullRequest
0 голосов
/ 11 июня 2018

Попытка собрать с помощью "build build":

module Main where


analyzeGold :: Int -> String
analyzeGold standard =
  if | standard == 999 -> "Wow! 999 standard!"
     | standard == 750 -> "Great! 750 standard."
     | standard == 585 -> "Not bad! 585 standard."
     | otherwise -> "I don't know such a standard..."

main :: IO ()
main = do
  putStrLn (analyzeGold 999)

И я получил:

    Multi-way if-expressions need MultiWayIf turned on
  |
6 |   if | standard == 999 -> "Wow! 999 standard!"
  |   ^^

Как это исправить?

стек 1.7.1,GHC 8.2.2

1 Ответ

0 голосов
/ 11 июня 2018

Ну, в Хаскеле есть только предложение if - then - else.Если вам нужны эти операторы " multi-if ", вы используете guard .

Использование guard

Ваш синтаксисуже достаточно близко к охраннику, за исключением того, что не имеет ключевое слово if и что используется знак равенства (=)чтобы обозначить, что вывод в этом случае.

Таким образом, вы должны переписать его в:

analyzeGold :: Int -> String
analyzeGold standard
    | standard == 999 <b>=</b> "Wow! 999 standard!"
    | standard == 750 <b>=</b> "Great! 750 standard."
    | standard == 585 <b>=</b> "Not bad! 585 standard."
    | otherwise <b>=</b> "I don't know such a standard..."

См. здесь [lyah] для получения некоторой информации о синтаксисе ииспользование охранников.

Использование шаблона s

Поскольку ваши проверки каждый раз проверяют равенство целочисленных литералов, мы можем фактически перемещать проверки от охранников к шаблонам, например:

analyzeGold :: Int -> String
analyzeGold <b>999</b> = "Wow! 999 standard!"
analyzeGold <b>750</b> = "Great! 750 standard."
analyzeGold <b>585</b> = "Not bad! 585 standard."
analyzeGold <b>_</b> = "I don't know such a standard..."

Здесь подчеркивание (_) действует как подстановочный знак , который соответствует всем значениям (а также всем шаблонам, которые не соответствуют более ранним предложениям).

Использование MultiWayIf расширения

Вы также можете включить расширение GHCi, чтобы включить это расширение, написав прагму в заголовке файла.или используя -XMultiWayIf при вызове интерпретатора.Итак:

<b>{-# LANGUAGE MultiWayIf #-}</b>

analyzeGold :: Int -> String
analyzeGold standard =
    if | standard == 999 -> "Wow! 999 standard!"
       | standard == 750 -> "Great! 750 standard."
       | standard == 585 -> "Not bad! 585 standard."
       | otherwise -> "I don't know such a standard..."

Или:

$ ghci <b>-XMultiWayIf</b>
GHCi, version 8.0.2: http://www.haskell.org/ghc/  :? for help
Prelude> :{
Prelude| analyzeGold :: Int -> String
Prelude| analyzeGold standard =
Prelude|     if | standard == 999 -> "Wow! 999 standard!"
Prelude|        | standard == 750 -> "Great! 750 standard."
Prelude|        | standard == 585 -> "Not bad! 585 standard."
Prelude|        | otherwise -> "I don't know such a standard..."
Prelude| :}
...