2014-11-24 35 views
14

Po włączeniu rozszerzenia językowego TypeOperators możliwe jest zdefiniowanie operatorów własnego typu. Ponadto można ustawić ich względne pierwszeństwo za pomocą infix*. Ale jaki jest na przykład precedens (->)?Pierwszeństwo operatora typu Haskell

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

To wstyd, a może to błąd, że nie są one wymienione. –

Odpowiedz

13

Oto stosowne fragmenty źródeł GHC w 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 '->' 

więc stałość -> jest infixr 0.

Można to również uzyskać z komunikatu o błędzie. Utwórz następujący plik źródłowy Haskell:

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

Następnie:

GHCi> :kind Int // Int -> Int 

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