0
temperatura :: Float->Float
temperatura qCalor
    | qCalor == 0 = 10
    | 0 < qCalor < 3 = 30--fTem1
    | 3 <= qCalor <= 9 = 50
    | qCalor > 9 = 60--fTemp2
    | 15 <= qCalor <= 24 = 150
    | 24 < qCalor <= 27 = 170--fTemp3
    | otherwise = "Nao existe temperatura correspondente a esse calor no grafico!"

優先順位解析エラーはなぜですか?

4

2 に答える 2

8

まず、質問をするときは、実際のエラーを投稿すると役に立ちます。これが私が得たものです:

test.hs:3:7:
    Precedence parsing error
        cannot mix `<' [infix 4] and `<' [infix 4] in the same infix expression

test.hs:4:7:
    Precedence parsing error
        cannot mix `<=' [infix 4] and `<=' [infix 4] in the same infix expression

test.hs:6:7:
    Precedence parsing error
        cannot mix `<=' [infix 4] and `<=' [infix 4] in the same infix expression


test.hs:7:7:
    Precedence parsing error
        cannot mix `<' [infix 4] and `<=' [infix 4] in the same infix expression

さて、問題は基本的に<(および他の比較演算子) が実際には単なる 2 項関数、つまり 2 つの引数を取る関数であることです。コンパイラは、これらの関数の優先順位が同じであるため、式に括弧を配置する方法を知る方法がないことを伝えています。たとえば、これを見てください:

| 0 < qCalor < 3 = 30

コンパイラは、それが意味するのか、(0 < qCalor) < 3それとも0 < (qCalor < 3). いずれにせよ、その行に適切な入力はありません。

のようなものを提案するか(0 < qCalor) && (qCalor < 3)、さらに良いことに、次のような関数を使用することをお勧めします(おそらくこれには組み込み関数があります):

betweenNums a b c = (a < b) && (b < c)
于 2013-01-08T03:39:33.647 に答える
3

次のような python スタイルの式に注意してください。

x < y < z

正当な Haskell ではありません。これでも正しくありません:

(x < y) < z

なぜなら:

Prelude> :t (<)
(<) :: Ord a => a -> a -> Bool

<、>、<=、および >= で比較するものは、同じ型でなければなりません。(x < y)Bool を生成します。したがって、次のステップ(あなたの場合)はBool < Float不可能です。

于 2013-01-08T09:21:44.770 に答える