Operador de tipo Haskell precedencia
operators ghci (1)
Aquí están los bits relevantes de las fuentes de GHC en 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 ''->''
Así que la fijeza de ->
es infixr 0
.
También puede inferir esto de un mensaje de error. Crea el siguiente archivo fuente de Haskell:
{-# LANGUAGE TypeOperators #-}
data a // b
infixl 0 //
Entonces:
GHCi> :kind Int // Int -> Int
<interactive>:1:5:
Precedence parsing error
cannot mix ‘//’ [infixl 0] and ‘(->)’ [infixr 0] in the same infix expression
Cuando la extensión de idioma TypeOperators
está habilitada, es posible definir operadores de tipo propios. Además, es posible establecer su precedencia relativa con infix*
. Pero, ¿cuál es la precedencia de (->)
, por ejemplo?
> :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''