2014-11-24 55 views
14

启用语言扩展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' 
+6

这是一个耻辱,也许他们没有列出的错误。 – 2014-11-24 00:52:25

回答

13

这里是的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