2013-03-10 262 views
6

您需要的唯一输入是您得到的成绩编号。这是我迄今为止所拥有的。Haskell中if语句的正确语法

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") 

但也不能工作。

+1

您需要在每个if之前添加else。 – 2013-03-10 01:28:46

+2

在这里使用警卫而不是嵌套'if's会更好。 – hammar 2013-03-10 01:43:27

回答

7

除了代码大师的回答,您不能在条件中有let,否则变量x将不会在需要它的以下表达式中可用。

在你的情况,你甚至都不需要让约束力的,因为你只是想立即返回字符串,这样你就可以这样做:

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 - 你必须将两个表达式和一个布尔AND组合起来。

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

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" 
+2

这看起来像一个家庭作业问题,因此提供完整的解决方案并不是一个好主意。 – amindfv 2013-03-10 06:27:21

+1

我没有想到这个.. OP应该真的说明可能。 – 2013-03-10 16:47:58

1

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

1

定义x不会把它定义了其词法范围的 - 在这种情况下,x不会对任何访问。相反,使用语法

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

而且,使用所有这些if S的不是在Haskell的最佳途径。相反,你可以使用保护语法:

insideText x 
    | elem x [2,3,7] = "Best" 
    | elem x [8,9,0] = "Better" 
    | otherwise  = "Ok." 
1

为了完整起见,这里的守卫语法通过@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'。

+0

既然你问:“E'怎么样?”:[在美国](http://en.wikipedia。org/wiki/Academic_grading_in_the_United_States)(可能还有别的地方,但我只能跟美国说),标准的学术成绩是A,B,C,D和F; F是唯一失败的等级。 (你也可以得到一个A +或A-,B±,C±或D±,但不是F±。)有时E用来代替F,因为E接下来;但F是传统的,因为它代表“失败”而被使用。 (或者至少,我认为这就是为什么他们使用F.) – 2013-03-10 07:26:09