54 votes

Le ($) de Haskell est un opérateur magique ?

Disons que j'ai les fonctions suivantes :

infixr 0 <|

{-# INLINE (<|) #-}
(<|) :: (a -> b) -> a -> b
f <| x = f x

foo :: a -> (forall b. b -> b) -> a
foo x f = f x

Ce qui suit n'est pas un contrôle de type :

ghci> foo 3 <| id

Couldn't match expected type `forall b. b -> b'
            with actual type `a0 -> a0'
In the second argument of `(<|)', namely `id'
In the expression: f 3 <| id
In an equation for `it': it = f 3 <| id

Cependant, foo 3 $ id fait .

La définition de (<|) est (pour autant que je sache) identique à celle de ($). J'ai pratiquement arraché la définition des sources de la bibliothèque de base, et changé chaque instance de ($) en (<|). La magie du compilateur ?

69voto

J. Abrahamson Points 27606

Oui, il y a une petite quantité de magie du compilateur autour de ($) pour gérer les types imprédicatifs. Il a été introduit parce que tout le monde s'attend à ce que

runST $ do
  foo
  bar
  baz

pour vérifier la typographie, mais il ne peut pas le faire normalement. Pour plus de détails, voir ici (recherche runST ), cette e-mail et ceci e-mail . En résumé, il y a une règle spéciale dans le vérificateur de type spécifiquement pour ($) ce qui lui donne la possibilité de résoudre le cas courant des types imprédicatifs.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X