Haskell类型的运算符优先级

pol*_*.ph 17 haskell operators operator-precedence ghci

TypeOperators启用语言扩展后,可以定义自己的类型运算符.此外,可以设置它们的相对优先级infix*.但是(->),例如,优先权是什么?

> :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'
Run Code Online (Sandbox Code Playgroud)

kos*_*kus 17

以下是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 '->'
Run Code Online (Sandbox Code Playgroud)

所以固定性->infixr 0.

您还可以从错误消息中推断出这一点.创建以下Haskell源文件:

{-# LANGUAGE TypeOperators #-}
data a // b
infixl 0 //
Run Code Online (Sandbox Code Playgroud)

然后:

GHCi> :kind Int // Int -> Int

<interactive>:1:5:
    Precedence parsing error
        cannot mix ‘//’ [infixl 0] and ‘(->)’ [infixr 0] in the same infix expression
Run Code Online (Sandbox Code Playgroud)