2014-11-24 16 views
14

Quando l'estensione della lingua TypeOperators è abilitata, è possibile definire operatori di tipo proprio. Inoltre, è possibile impostare la relativa precedenza relativa con infix*. Ma qual è la precedenza di (->), ad esempio?Tipo di operatore Haskell precedenza

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

E 'un peccato e, forse, un bug che non sono elencati. –

risposta

13

Ecco i bit rilevanti delle sorgenti GHC in 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 '->' 

Così la fissità della -> è infixr 0.

È inoltre possibile dedurre da un messaggio di errore. Creare il seguente file di origine Haskell:

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

Poi:

GHCi> :kind Int // Int -> Int 

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