2013-03-10 18 views
6

必要な入力は、取得する等級番号だけです。これはこれまで私が持っていたものです。Haskellの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") 

をが、それはどちらか動作しませんでした:

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" 

これは私にエラー「「場合は `入力にエラーを解析」を与える、私も試してみました。

+1

場合は、「F」を獲得するために論理的な誤りを訂正します。 –

+2

ネストされた 'if'の代わりにここでガードを使う方が良いでしょう。 – hammar

答えて

7

Code-Guruの答えに加えて、条件内にを含めることはできません。そうでなければ、変数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を行うことができない、注意してください:あなたはちょうどすぐに文字列を返すようにしたいので、あなただけ行うことができますので、あなたの場合は

、あなたも、聞かせて結合する必要はありません - 2つの式をブールANDで結合する必要があります。

以上、さらにガードを使用して、構文的に単純化することができます:xの定義

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

+1

私はそれについて考えなかった。 –

1

ifの前にelseを追加する必要があります。ハスケルでは、すべての式が評価されなければならないことを思い出してください。つまり、ifの文には一致するthen句と一致するelse句が必要です。あなたのコードはelseifの4つしかありません。コンパイラは、elseがないために不平を言う。これを修正すると、Haskellコードは他のプログラミング言語のチェーンif...else if...elseのようになります。

1

はそのレキシカルスコープの外にそれを定義しません - この場合には、xは何にアクセスできません。代わりに、また、それらのif秒のすべてを使用すると、Haskellでは最善の方法ではありません

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

を構文を使用します。完全のために

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である必要があるからです。次のすべてのガードのために、ガードが試みられるたびに、先行するガードはすべて偽であることが保証されます。

また、これはあなたがそれぞれ `if`の前に` else`を追加する必要があるのx == 90

+0

あなたは「どうしたらいいの?」と尋ねるので:[米国で](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.を使う理由と推測しています) –

関連する問題