2014-05-17 19 views
12

Ich gehe über die Vektor-Bibliothek und bemerkte eine {-# INLINE_FUSED transform #-} und ich fragte mich, was es tut? Ich sehe es in vector.h definiert, aber nirgendwo sonst.INLINE_FUSED Pragma in Haskell

Antwort

11

Die Definitionen bedeuten, dass INLINE_FUSED dasselbe ist wie INLINE [1]; INLINE_INNER ist das gleiche wie INLINE [0]. Die [1] und [0] sind Standard-Ghc zum Bestellen der Phasen des Inlining. Siehe die Diskussion unter der Überschrift 7.13.5.5. Phasensteuerung in http://www.haskell.org/ghc/docs/7.0.4/html/users_guide/pragmas.html

vector muss die Stufen, bei denen ghc Inline verschiedene Definitionen zu steuern. Zuerst möchte es, dass alle Verwendungen der Funktionen stream und unstream verfügbar gemacht werden, so dass (vor allem) stream.unstream durch id ersetzt werden kann, und ebenso in anderen Fällen, gemäß den (neu geschriebenen) RULE-Pragmas, die überall verteilt sind.

Typische Vektor-zu-Vektor-Funktionen werden als unstream . f . stream geschrieben, wobei f eine Stream-zu-Stream-Funktion ist. unstream baut einen aktuellen Vektor im Speicher von einer Stream; stream liest einen echten Vektor in eine Stream. Das Ziel des Spiels ist es, die Anzahl der tatsächlich gebauten Vektoren zu reduzieren. So ist die Zusammensetzung von drei Vektorfunktionen Vektor

f_vector . g_vector . h_vector 

ist wirklich

unstream . f_stream . stream . unstream . g_stream . stream . unstream . h_stream . stream 

die seine neu geschrieben

unstream . f_stream . g_stream . h_stream . stream 

und so weiter. Also schreiben wir einen neuen Vektor statt drei.

Die Regeln für transform sind ein wenig schicker als diese, sondern gehören mit dem gleichen subtilen Ordnungssystem:

transform f g (unstream s) = unstream (Bundle.inplace f g s) 
transform f1 g1 (transform f2 g2 p) = transform (f1 . f2) (g1 . g2) p 

in https://github.com/haskell/vector/blob/master/Data/Vector/Generic/New.hs#L76

so kann man sehen, wie etwas in Form inlined:

unstream . h_stream . stream . transform f1 g1 . transform f2 g2 
        . unstream . j_stream . stream $ input_vector 

würde umgeschrieben werden.

+0

Danke Arthur, du hast es sehr deutlich erklärt. – jap