Правильный синтаксис для операторов if в Haskell
единственный вход, который вам нужен, это номер класса, который вы получаете. Это то, что у меня есть до сих пор.
myScore x = if x > 90
then let x = "You got a A"
if 80<x<90
then let x = "you got a B"
if 70<x<80
then let x = "You got a C"
if 60<x<90
then let x = "you got a D"
else let x = "You got a F"
это дает мне ошибку "ошибка разбора на входе "если"", я также попытался:
myScore x = (if x > 90 then "You got an A" | if 80 < x < 90 then "You got a B" | if 70 < x < 80 then "You got a D" | if 60 < x < 70 then "You got a D" else "You got a F")
но это не сработало.
4 ответов
в дополнение к ответу код-гуру, вы не можете иметь let
внутри условных обозначений, иначе переменная x
не будет доступен в следующем выражении, которое нуждается в нем.
в вашем случае вам даже не нужна привязка let, потому что вы просто хотите немедленно вернуть строку, поэтому вы можете просто сделать:
myScore x =
if x > 90 then "You got a A"
else if 80 < x && x < 90 then "you got a B"
else if 70 < x && x < 80 then "You got a C"
else if 60 < x && x < 70 then "you got a D"
else "You got a F"
Также обратите внимание, вы не можете сделать 80<x<90
- вы должны объединить два выражения с логическим и.
выше можно дальше упрощенный синтаксически, используя guards:
myScore x
| x > 90 = "You got a A"
| x > 80 = "you got a B"
| x > 70 = "You got a C"
| x > 60 = "you got a D"
| othwerwise = "You got a F"
вам нужно добавить else
перед каждым if
. Напомним, что в Haskell, каждое выражение должно иметь значение. Это означает, что когда-либо if
оператор должен иметь соответствующий then
предложение и соответствующий else
предложения. Ваш код имеет только один else
четыре if
s. Компилятор жалуется из-за отсутствия else
s. Когда вы это исправите, ваш код Haskell будет выглядеть как if...else if...else
цепочка из других языков программирования.
определение x
не будет определять его вне лексической области - в этом случае,x
не будет доступен ни для чего. Вместо этого, используйте синтаксис
let x =
if 5 < 4
then "Hmm"
else "Better"
in "Here's what x is: " ++ x
кроме того, используя все эти if
s не лучший способ в Haskell. Вместо этого можно использовать синтаксис guard:
insideText x
| elem x [2,3,7] = "Best"
| elem x [8,9,0] = "Better"
| otherwise = "Ok."
для полноты, здесь синтаксис guard, предложенный @hammar:
myScore x
| x > 90 = "A"
| x > 80 = "B"
| x > 70 = "C"
| x > 60 = "D"
| otherwise = "F"
(как насчет "E"?)
обратите внимание, что не нужно проверять x > 80 && x < 90
здесь, потому что, когда он проходит первый охранник, это должно быть так x <= 90
. И так для всех следующих охранников: все предыдущие охранники гарантированно будут ложными, когда охранник будет испытан.
Это также исправляет логическую ошибку, чтобы набрать "F", если x == 90.