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

现在,问题基本上是<(和其他比较运算符)实际上只是二进制函数 - 带有两个参数的函数。编译器告诉您它无法知道如何在表达式中放置括号,因为这些函数具有相同的优先级。举个例子,这个:

| 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 < Float是不可能的。

于 2013-01-08T09:21:44.770 回答