Question Préséance de l'opérateur de type Haskell


Lorsque l'extension de la langue TypeOperators est activé, il est possible de définir des opérateurs de type propres. En outre, il est possible de définir leur priorité relative avec infix*. Mais quelle est la priorité de (->), par exemple?

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

15
2017-11-24 00:42


origine


Réponses:


Voici les bits pertinents des sources GHC dans 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 '->'

Donc la fixité de -> est infixr 0.

Vous pouvez également déduire ceci d'un message d'erreur. Créez le fichier source Haskell suivant:

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

Alors:

GHCi> :kind Int // Int -> Int

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

13
2017-11-24 07:16