Haskell中的嵌套控件结构

时间:2013-03-06 19:39:16

标签: haskell if-statement

有没有办法创建嵌套控件结构? 例如我试过这个。但我得到了错误。

bmiTell :: (RealFloat a) => a -> String  

bmiTell bmi  = if bmi <= 18.5  then if bmi==16.0 then "asdasdasdsad"
           else if bmi <= 25.0 then "You're supposedly normal. Pffft, I bet  you're ugly!"  
           else if bmi <= 30.0 then "You're fat! Lose some weight, fatty!"  
           else    "You're a whale, congratulations!"  

2 个答案:

答案 0 :(得分:11)

if表达式被解析为

if bmi <= 18.5   -- no else!
  then if bmi==16.0
         then "asdasdasdsad"
         else if bmi <= 25.0
                then "You're supposedly normal. Pffft, I bet  you're ugly!"  
                else if bmi <= 30.0
                       then "You're fat! Lose some weight, fatty!"  
                       else "You're a whale, congratulations!"

请注意,第一个if有一个then分支但没有else分支。

在Haskell中,每个if表达式必须具有then分支 else分支。这就是你的问题。

我的第二个bchurchill建议使用警卫而不是嵌套的if表达。

答案 1 :(得分:9)

是的,你只需要妥善缩进。 ghc可能不喜欢被告知它也很胖。在任何一种情况下,缩进都会确定哪些分支对应于哪些语句,我可能会稍微搞砸一下这个命令:

bmiTell bmi  = if bmi <= 18.5  
               then if bmi==16.0 
                    then "asdasdasdsad"
                    else if bmi <= 25.0 
                         then "You're supposedly normal. Pffft, I bet  you're ugly!"  
                         else if bmi <= 30.0 
                              then "You're fat! Lose some weight, fatty!"  
                              else    "You're a whale, congratulations!"  
               else "foobar"

更好的方法是使用受保护的条件,例如

bmiTell bmi
  | bmi < 18.5 = "foo"
  | bmi < 25.0 = "bar"
  | bmi < 30.0 = "buzz"