2012-03-28 28 views
7

Biorąc pod uwagę następujący kod (skopiowany z biblioteki attoparsec), co robi wbudowana pragma? Przypuszczam, że sensowne jest, aby tylko fmapR było wstawione, ale nie inne, które są zdefiniowane w innych instancjach Functor.INLINE Pragma w połączeniu z klasami typów

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

Odpowiedz

4

Inline Pragma skopiuje zawartość funkcji (w tym przypadku fmapR) do miejsca, w którym jest on nazywany, jeśli kompilator może udowodnić, że funktor używany jest IResult.

funkcja nie może być wstawiane w poniższym przypadku, ponieważ definicja fmap nie jest znana:

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

Tutaj jednak jest znane, gdyż pewna funktor jest używany, a funkcja może być inline:

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

Ah, więc fmap jest "przepisany" jako fmapR, ale fmapR może nie być wstawiony, jeśli rozumiem to poprawnie? – Long

+0

@ Long - tak, to prawda. –