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 : c
是 a : (b : c)
。请注意,如果它是左关联的,那么 a : b : c
将(可能)是一个类型错误!
对于使用相同操作数的函数,例如+
或*
不止一次,它会如何评价?
例如,在下面的代码中:
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 : c
是 a : (b : c)
。请注意,如果它是左关联的,那么 a : b : c
将(可能)是一个类型错误!