2012-03-28 8 views
7

Dado el siguiente código (copiado de la biblioteca attoparsec), ¿qué hace el pragma en línea? Supongo que tiene sentido que solo fmapR esté alineado, pero no los otros fmap s que se definen en otras instancias de Functor.INLINE Pragma en combinación con las clases de tipo

instance Functor (IResult t) where 
    fmap = fmapR 
    {-# INLINE fmap #-} 

Respuesta

4

La línea pragma copiará el contenido de la función (en este caso fmapR) a la ubicación donde se le llama, si el compilador puede probar que el funtor que se utiliza es IResult.

La función no puede ser inline en el siguiente caso, porque la definición de fmap no se sabe:

f :: Functor f => f Int -> f Float 
f = fmap fromIntegral 

Aquí, sin embargo, se sabe, porque está siendo usado un cierto funtor, y la función puede estar en línea:

f :: IResult Int -> IResult Float 
f = fmap fromIntegral 
-- rewritten to: f = fmapR fromIntegral; might be further inlined 
+2

Ah, entonces fmap se "reescribe" como fmapR, pero fmapR podría no estar en línea, si entiendo eso correctamente? – Long

+0

@ Long: sí, eso es correcto. –

Cuestiones relacionadas