2012-03-28 4 views
7

Mit folgendem Code (aus der attoparsec-Bibliothek kopiert): Was macht das Inline-Pragma? Ich nehme an, dass es sinnvoll ist, nur fmapR inline zu sein, aber nicht die anderen fmap s, die in anderen Functor-Instanzen definiert sind.INLINE-Pragma in Kombination mit Klassen

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

Antwort

4

Der Inline Pragma wird der Inhalt der Funktion (in diesem Fall fmapR) an die Stelle kopieren, wo sie genannt wird, wenn der Compiler nachweisen kann, dass der Funktor verwendet IResult wird.

Die Funktion kann nicht im folgenden Fall inline sein, da die Definition von fmap nicht bekannt ist:

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

Hier ist es jedoch bekannt ist, weil ein gewisser Funktors verwendet wird, und die Funktion kann inline sein:

+2

Ah, also fmap wird als fmapR "umgeschrieben", aber fmapR ist möglicherweise nicht inline, wenn ich das richtig verstehe? – Long

+0

@Long - ja, das ist richtig. –