Правильный синтаксис для операторов 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 четыре ifs. Компилятор жалуется из-за отсутствия elses. Когда вы это исправите, ваш код Haskell будет выглядеть как if...else if...else цепочка из других языков программирования.


определение x не будет определять его вне лексической области - в этом случае,x не будет доступен ни для чего. Вместо этого, используйте синтаксис

let x = 
      if 5 < 4
      then "Hmm"
      else "Better"
in "Here's what x is: " ++ x

кроме того, используя все эти ifs не лучший способ в 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.