Haskell类型运算符优先级
问题描述:
启用语言扩展TypeOperators
时,可以定义自己的类型运算符。另外,可以将它们的相对优先级设置为infix*
。但是,例如(->)
的优先顺序是什么?Haskell类型运算符优先级
> :i (->)
data (->) a b -- Defined in `GHC.Prim'
instance Monad ((->) r) -- Defined in `GHC.Base'
instance Functor ((->) r) -- Defined in `GHC.Base'
instance Applicative ((->) a) -- Defined in `Control.Applicative'
instance Arrow (->) -- Defined in `Control.Arrow'
instance Monoid b => Monoid (a -> b) -- Defined in `Data.Monoid'
instance ArrowLoop (->) -- Defined in `Control.Arrow'
instance ArrowChoice (->) -- Defined in `Control.Arrow'
instance ArrowApply (->) -- Defined in `Control.Arrow'
答
这里是的GHC源的相关位在compiler/basicTypes/BasicTypes.lhs
:
maxPrecedence, minPrecedence :: Int
maxPrecedence = 9
minPrecedence = 0
defaultFixity :: Fixity
defaultFixity = Fixity maxPrecedence InfixL
negateFixity, funTyFixity :: Fixity
-- Wired-in fixities
negateFixity = Fixity 6 InfixL -- Fixity of unary negate
funTyFixity = Fixity 0 InfixR -- Fixity of '->'
所以->
固定性是infixr 0
。
您还可以从错误消息中推断出这一点。创建以下哈斯克尔源文件:
{-# LANGUAGE TypeOperators #-}
data a // b
infixl 0 //
然后:
GHCi> :kind Int // Int -> Int
<interactive>:1:5:
Precedence parsing error
cannot mix ‘//’ [infixl 0] and ‘(->)’ [infixr 0] in the same infix expression
这是一个耻辱,也许他们没有列出的错误。 – 2014-11-24 00:52:25