Haskell型运算符优先级

Haskell型运算符优先级,haskell,operators,ghci,operator-precedence,Haskell,Operators,Ghci,Operator Precedence,启用语言扩展名TypeOperators时,可以定义自己的类型运算符。此外,还可以使用中缀*设置它们的相对优先级。例如,(>)的优先级是什么 > :i (->) data (->) a b -- Defined in `GHC.Prim' instance Monad ((->) r) -- Defined in `GHC.Base' instance Functor ((->) r) -- Defined in `GHC.Base' instance Appl

启用语言扩展名
TypeOperators
时,可以定义自己的类型运算符。此外,还可以使用
中缀*
设置它们的相对优先级。例如,
(>)
的优先级是什么

> :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'

以下是
编译器/basicTypes/basicTypes.lhs
中GHC源代码的相关位:

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

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

{-# LANGUAGE TypeOperators #-}
data a // b
infixl 0 //
然后:

GHCi>:种类Int//Int->Int
:1:5:
优先解析错误
不能在同一中缀表达式中混合“//”[infixl 0]和“(>)”[infixr 0]

遗憾的是,它们没有被列出,这可能是一个缺陷。与此同时,情况发生了变化:GHC处理
->
()的问题,因此,
->
的固定性现在在内部被改为
-1
GHCi> :kind Int // Int -> Int

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