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
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.
- 1. Haskell: GADT mit UNPACK Pragma
- 2. pragma omp parallel zur vs. pragma omp
- 3. Pragma Marke in schnellen
- 4. Sollte ich "#pragma GCC ..." oder "#pragma clang ..." in Xcode verwenden
- 5. #pragma innerhalb #define
- 6. Pragma Kommentar C++
- 7. Clang Pragma Umfassende Liste
- 8. SQLite JDBC PRAGMA Einstellung
- 9. Ignoriere #pragma Kommentar (lib, ...)?
- 10. Was macht das UNPACK-Pragma in diesem Fall?
- 11. Was bedeutet "#pragma Kommentar"?
- 12. Warum #pragma optimieren ("", aus)
- 13. Xcode - Mit #pragma mark
- 14. #pragma markieren Textfeld delegiert
- 15. Pragma deaktivieren für noUnusedLocals?
- 16. render Pragma Fehler
- 17. INLINE-Pragma in Kombination mit Klassen
- 18. Mit Pragma-s von SQLite in C#
- 19. Code-Faltung (Pragma-Region) in Qt Creator
- 20. Was bedeutet "magisches" Pragma in Nim?
- 21. Was entspricht "#pragma mark -" in swift?
- 22. #pragma funktioniert nicht richtig in C?
- 23. Haskell - Nichterschöpfende Musterabgleich in Haskell
- 24. Apple LLVM 5.0 pragma optimieren
- 25. Warnung über falsche Verpackung Pragma
- 26. openMP bedingte Pragma "wenn sonst"
- 27. SQLite3 Pragma synchrone nicht persistent
- 28. Fügt #pragma einmal Inklusionswächter hinzu?
- 29. Kann "#pragma once" Fehler verursachen?
- 30. #pragma markieren nicht den ersten Gruppennamen
Danke Arthur, du hast es sehr deutlich erklärt. – jap