online - Haskell''s($) es un operador de magia?
haskell pdf (1)
Digamos que tengo las siguientes funciones:
infixr 0 <|
{-# INLINE (<|) #-}
(<|) :: (a -> b) -> a -> b
f <| x = f x
foo :: a -> (forall b. b -> b) -> a
foo x f = f x
Lo siguiente no escribe cheque:
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
Sin embargo, foo 3 $ id
hace .
La definición de (<|) es (hasta donde yo sé) idéntica a la definición de ($). Casi arranqué la definición de las fuentes de la biblioteca base, y cambié cada instancia de ($) a (<|). ¿Compilador mágico?
Sí, hay una pequeña cantidad de magia de compilación ($)
para manejar tipos impredicativos. Fue introducido porque todos esperan
runST $ do
foo
bar
baz
para comprobar el tipo, pero normalmente no puede. Para obtener más detalles, consulte here (búsqueda runST
), este email y este email . En resumen, hay una regla especial en el verificador de tipos específico para ($)
que le da la capacidad de resolver el caso común de tipos impredicativos.