Ну, в Хаскеле есть только предложение 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| :}