1

ネストされた制御構造を作成する方法はありますか?たとえば、私はこれを試しました。しかし、エラーが発生しました。

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!"  
4

2 に答える 2

12

式は次の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の2番目の提案if

于 2013-03-06T19:44:24.463 に答える
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"
于 2013-03-06T19:43:18.600 に答える