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 ?