12

必要な入力は、取得した成績番号だけです。これは私がこれまでに持っているものです。

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"

これにより、「入力 `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")

しかし、それもうまくいきませんでした。

4

4 に答える 4

27

let条件内に を含めることはできません。そうしないと、変数xを必要とする次の式で変数を使用できなくなります。

あなたの場合、文字列をすぐに返したいだけなので、 let バインディングは必要ありません。

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つの式を&&演算子で組み合わせる必要があります..

上記は、ガードを使用して構文的にさらに単純化できます。

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"
    | otherwise = "You got a F"
于 2013-03-10T01:46:47.710 に答える
6

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

于 2013-03-10T01:31:03.130 に答える
3

完全を期すために、@hammar によって提案されたガード構文は次のとおりです。

myScore x
   | x > 90 = "A"
   | x > 80 = "B"
   | x > 70 = "C"
   | x > 60 = "D"
   | otherwise = "F"

(「え」はどうですか?)

ここでチェックする必要はないことに注意してください。x > 80 && x < 90最初のガードを通過するとき、それはx <= 90. 以下のすべてのガードについても同様です。ガードが試行されるたびに、先行するすべてのガードが偽であることが保証されます。

これにより、論理エラーも修正され、x == 90 の場合にスコアが 'F' になります。

于 2013-03-10T01:54:54.413 に答える
2

定義xしても、レキシカル スコープの外では定義されません。この場合、x何からもアクセスできません。代わりに、構文を使用します

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

また、これらifの s をすべて使用することは、Haskell では最善の方法ではありません。代わりに、guard 構文を使用できます。

insideText x
   | elem x [2,3,7] = "Best"
   | elem x [8,9,0] = "Better"
   | otherwise      = "Ok." 
于 2013-03-10T01:50:46.237 に答える