tutorial online funciones empresa descargar constructora company haskell

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.