Was ist Haskells Stream Fusion?
Was ist Haskell Stream Fusion und wie verwende ich es?
Kommentar zu dem Problem - Öffnen
Gibt es etwas, das Sie brauchen, zu wissen, was nicht bereits abgedeckt in diesem post? Wenn dem so ist, kann Sie sein spezifischer? Kommentarautor: Craig Stuntz
Verwandte: lambda.jstolarek.com/2013/04/haskell-as-fast-as-c-a-case-study Kommentarautor: Benjamin Crouzier
Hinweis: es gibt auch etwas namens Liste Fusion, das passiert automatisch mit vielen built-in Funktionen: downloads.haskell.org/~ghc/7.4.2/docs/html/users_guide/... und siehe auch conscientiousprogrammer.com/blog/2015/12/19/..., wie Sie überprüfen, dass es verwendet wird (oder versuchen Sie
stack bauen-ghc-Optionen "-ddump-Regel-Zündungen -ddump-Regel-schreibt" && finden .stack-Arbeit/ -name '*dump-Regel*'
). Kommentarautor: unhammerInformationsquelleAutor der Frage Daniel W | 2009-02-23
Schreibe einen Kommentar Antworten abbrechen
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dem Papier, das Logan Punkte zu groß ist, aber es ist ein wenig schwierig. (Fragen Sie meine Studenten.) Es ist auch viel über das "wie-stream fusion "funktioniert", und nur ein Bruchteil ', was stream-fusion ist und wie Sie es verwenden können'.
Das problem, dass der stream fusion löst ist, dass die funktionalen codes, wie Sie oft geschrieben zuordnen intermediate-Listen, z.B., um eine unendliche Liste von node-Nummern, den Sie schreiben,
Naiv code zuordnen würde eine unendliche Liste von Integer-zahlen
[1, 2, 3, ...]
ist, eine unendliche Liste von strings["1", "2", "3", ...]
, und schließlich eine unendliche Liste von Namen["n1", "n2", "n3", ...]
. Das ist zu viel Aufteilung.Was stream fusion macht ist übersetzen eine definition wie
nodenames
in etwas verwendet eine rekursive Funktion, reserviert nur, was notwendig ist für das Ergebnis. Im Allgemeinen, Beseitigung der Zuordnung der intermediate-Listen genannt wird Entwaldung.Verwenden stream-fusion, die Sie schreiben müssen nicht-rekursive Funktionen der Liste, dass die Funktionen von stream-fusion-Bibliothek beschrieben, in GHC-ticket 915 (
map
,foldr
, und so weiter) anstelle expliziter Rekursion. Diese Bibliothek enthält neue Versionen der Prelude-Funktionen wurden umgeschrieben, um exploit-stream-Verschmelzung. Anscheinend hat dieses Zeug ist geplant, in den nächsten GHC release (6.12), ist aber nicht in der aktuellen stable-version (6.10). Wenn Sie möchten, verwenden Sie die Bibliothek Porges hat eine nette einfache Erklärung in seiner Antwort.Wenn Sie wirklich wollen, eine Erklärung, wie die stream-fusion arbeitet, nach einer anderen Frage---aber das ist viel schwieriger.
InformationsquelleAutor der Antwort Norman Ramsey
Soweit ich informiert bin, und im Gegensatz zu dem, was Norman gesagt, stream fusion ist nicht derzeit in GHC-Basis (ie. Sie können nicht nur verwenden, Prelude-Funktionen). Weitere Informationen finden Sie unter GHC-ticket 915.
Verwenden stream-fusion zu installieren, müssen Sie die stream-fusion-Bibliothek, import von Daten.Liste.Stream (Sie können auch importieren Sie die Kontrolle.Monade.Stream) und nur die Funktionen aus diesem Modul eher als die Prelude-Funktionen. Dies bedeutet, Import Prelude hiding all die Standard-Funktionen der Liste, und nicht mit [x..y] oder Konstrukte Liste Verständnis.
InformationsquelleAutor der Antwort porges
Ist es nicht richtig, dass, wenn GHC in 6.12 nutzt diese neuen Funktionen standardmäßig aus, dass Sie auch implementieren [x..y] und Liste Verstehens in das nicht-rekursive Weise? Weil der einzige Grund, warum Sie nicht das richtige Zeile, ist, dass Sie internen und nicht wirklich geschrieben in Haskell, aber mehr wie keywords, für die Schnelligkeit Willen, und/oder weil Sie nicht in der Lage, neu zu definieren, die syntax.
InformationsquelleAutor der Antwort BAReFOOt