haskell operators ghci operator-precedence

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