Haskell 计算相同优先级的 2 个操作数的顺序是什么?

What order would Haskell evaluate 2 operands of the same precedence?

对于使用相同操作数的函数,例如+*不止一次,它会如何评价?

例如,在下面的代码中:

prodOfThree :: Int -> Int -> Int
prodOfThree a b c = a*b*c

如何评估以下内容?

prodOfThree (2+3) 4 2

据我所知:

=> (2 + 3) * 4 * 2
=> 5 * 4 * 2

然后我不确定它是先乘 5*4,先乘 4*2,还是先乘 5*4*2

您可以使用 ghci:

请求运算符的 infixity
>>> :info (*)
class Num a where
  ...
  (*) :: a -> a -> a
  ...
        -- Defined in `GHC.Num'
infixl 7 *

或者你可以look it up on Hackage. A good way to search Hackage is with Hoogle or Hayoo.

因为 * 有不固定性 infixl 7 这意味着它是 左关联 并且优先级 7。因此,a * b * c(a * b) * c.

一个更有趣的例子是一个不具有数学结合性 属性 的运算符,例如 -(不要与它确实具有的不固定性混淆)。不固定性是 infixl 6 因此 a - b - c(a - b) - c.

右结合运算符的一个例子是::

>>> :info (:)
data [] a = ... | a : [a]       -- Defined in `GHC.Types'
infixr 5 :

所以 a : b : ca : (b : c)。请注意,如果它是左关联的,那么 a : b : c 将(可能)是一个类型错误!