1

我仍在努力学习 Haskell 的语法,因为它不同于我以前见过的任何其他编程语言。在大多数命令式编程语言中,可以创建如下嵌套条件语句:

function thing1(x){
    if(x > 2){
       if(x < 5){
           return 3;
       }
       else if(x < 10){
           return 10;
       }
       else if(x >= 10){
           return 6;
       }
    }
    else{
        return 4;
    }

}

但是,经过几次尝试,我仍然没有弄清楚 Haskell 中的等效语法:我尝试在 Haskell 中创建等效函数,但出现语法错误prog.hs:10:1: parse error on input main'::

thing1 x =
    if x > 2 then
        if x < 5 then
            3
        else if x < 10 then
            10
        else if(x >= 10)
            6
    else
        4

main = do
    putStr(show(thing1 6))

我不确定这里的语法有什么问题:甚至可以像在其他语言中一样在 Haskell 中创建嵌套条件语句吗?

4

3 回答 3

10

正如一些人建议的那样,您可以使用模式保护更轻松地做到这一点:

thing1 x
  | x <=  2 = 4
  | x <   5 = 3
  | x <  10 = 10
  | x >= 10 = ???

main = putStr (show (thing1 6))

这不是更整洁吗?弄清楚每种情况下返回的确切内容不是容易得多吗?

更新:在我忘记之前,一个常见的习惯是这样做:

thing1 x
  | x <=  2   = 4
  | x <   5   = 3
  | x <  10   = 10
  | otherwise = 6

这使不经意的观察者更清楚地知道实际上涵盖了所有情况。

于 2013-08-03T06:53:18.730 回答
3

你已经忘记了thenif(x >= 10)你还需要一个else分支。但既然if(x >= 10)已经是你的else分支,if x < 10你可以删除if(x >= 10)或将其添加到评论中:

thing1 x =
if x > 2 then
    if x < 5 then
        3
    else if x < 10 then
        10
    else
        6
else
    4
于 2013-08-03T09:06:45.447 回答
1

您在 X > 2 部分中没有不完整(未回答)的分支吗?

 if x < 5 then
    3
 else if x < 10 then
    10
 // else, what answer here?

elseHaskell 中是强制性的。

见:http ://en.wikibooks.org/wiki/Haskell/Control_structures

于 2013-08-03T06:26:37.540 回答