12

您需要的唯一输入是您获得的年级编号。这就是我到目前为止所拥有的。

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"

这给了我一个错误“输入'if'上的解析错误”,我也尝试过:

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

4 回答 4

27

您不能let在条件句中使用,否则该变量x在需要它的以下表达式中将不可用。

在您的情况下,您甚至不需要 let-binding 因为您只想立即返回字符串,所以您可以这样做:

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- 您必须将两个表达式与&&运算符结合起来。

以上可以在语法上进一步简化,使用警卫:

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"
    | otherwise = "You got a F"
于 2013-03-10T01:46:47.710 回答
6

您需要else在每个if. 回想一下,在 Haskell 中,每个表达式都必须计算为一个值。这意味着每个if表达式都必须有一个匹配then子句和一个匹配else子句。您的代码只有一个else带有四个ifs。编译器因为缺少elses 而抱怨。当你修复它时,你的 Haskell 代码看起来很像if...else if...else来自其他编程语言的链。

于 2013-03-10T01:31:03.130 回答
3

为了完整起见,这里是@hammar 建议的保护语法:

myScore x
   | x > 90 = "A"
   | x > 80 = "B"
   | x > 70 = "C"
   | x > 60 = "D"
   | otherwise = "F"

(“E”呢?)

注意这里不需要检查x > 80 && x < 90,因为当它通过第一个守卫时,它必须是那个x <= 90。对于以下所有守卫也是如此:无论何时尝试使用守卫,所有前面的守卫都保证为假。

如果 x == 90,这也更正了逻辑错误以得分“F”。

于 2013-03-10T01:54:54.413 回答
2

定义x不会将其定义在其词法范围之外——在这种情况下,x任何东西都无法访问。相反,使用语法

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

此外,使用所有这些ifs 并不是 Haskell 中的最佳方式。相反,您可以使用保护语法:

insideText x
   | elem x [2,3,7] = "Best"
   | elem x [8,9,0] = "Better"
   | otherwise      = "Ok." 
于 2013-03-10T01:50:46.237 回答