Qu'est-ce que Haskell Flux de Fusion
Qu'est-ce que Haskell Flux de Fusion et comment puis-je l'utiliser?
- Est-il quelque chose que vous avez besoin de savoir qui n'est pas déjà couvert dans la ce post? Si oui, pouvez-vous être plus précis?
- Connexes: lambda.jstolarek.com/2013/04/haskell-as-fast-as-c-a-case-study
- Remarque: il est aussi quelque chose qui s'appelle la Liste de la Fusion, qui se fait automatiquement avec beaucoup de fonctions intégrées: downloads.haskell.org/~ghc/7.4.2/docs/html/users_guide/... et de voir conscientiousprogrammer.com/blog/2015/12/19/... sur la façon de vérifier qu'il est utilisé (ou d'essayer
stack build --ghc-options "-ddump-rule-firings -ddump-rule-rewrites" && find .stack-work/ -name '*dump-rule*'
).
InformationsquelleAutor Daniel O | 2009-02-23
Vous devez vous connecter pour publier un commentaire.
Le papier que Logan est grand, mais c'est un peu difficile. (Il suffit de demander à mes élèves.) Il est aussi beaucoup question de flux de fusion fonctionne "et que seule une fraction" ce flux de fusion est et comment vous pouvez l'utiliser".
Le problème du flot de fusion résout, c'est que fonctionnelle codes comme l'écrit souvent allouer intermédiaire des listes, par exemple, pour créer une liste infinie de numéros de nœuds, vous pouvez écrire
Naïf code serait d'allouer une liste infinie d'entiers
[1, 2, 3, ...]
, une liste infinie de chaînes["1", "2", "3", ...]
, et, éventuellement, une liste infinie de noms["n1", "n2", "n3", ...]
. C'est trop de répartition.Ce flux de fusion n'est traduire une définition comme
nodenames
dans quelque chose qui utilise une fonction récursive qui alloue seulement ce qui est nécessaire pour la suite. En général, l'élimination de l'allocation de l'intermédiaire des listes est appelé la déforestation.À utiliser le volet de fusion, vous devez écrire non-récursive de la fonction de liste qui utilisent les fonctions de l'stream-fusion de la bibliothèque décrite dans GHC billet 915 (
map
,foldr
, et ainsi de suite) au lieu de récursion explicite. Cette bibliothèque contient les nouvelles versions de tous le Prélude des fonctions qui ont été réécrits pour exploiter les flux de fusion. Apparemment, ce genre de choses est prévu de le faire dans le prochain GHC libération (6.12) mais n'est pas dans la version stable actuelle (6.10). Si vous souhaitez utiliser la bibliothèque Porges a une belle explication simple dans sa réponse.Si vous voulez vraiment une explication de la façon dont flux de fusion travaille, poster une autre question---mais c'est beaucoup plus difficile.
$
et la composition.
?Autant que je suis conscient, et contrairement à ce que Norman a dit, diffuser de la fusion est pas actuellement mis en œuvre dans GHC de base (ie. vous ne pouvez pas simplement utiliser le Prélude de fonctions). Pour plus d'informations, voir GHC billet 915.
À utiliser le volet de fusion, vous devez installer le stream-fusion de la bibliothèque, l'importation de Données.Liste.Flux (vous pouvez également le Contrôle de l'importation.Monade.Stream) et n'utiliser que les fonctions de ce module, plutôt que le Prélude fonctions. Cela signifie que l'importation le Prélude à masquer tous la liste par défaut des fonctions, et non pas à l'aide de [x..y] de construire ou de compréhension de liste.
N'est-il pas correct, que lorsque GHC dans 6.12 utilise les nouvelles fonctions par défaut, qu'ils mettront également en œuvre [x..y] et interprétations de la liste dans que la non-récursive de la sorte? Parce que la seule raison pour laquelle ils ne sont pas en ligne droite, c'est qu'ils sont interne et pas vraiment écrit en Haskell, mais plus comme des mots clés, pour la vitesse du saké et/ou parce que vous ne seriez pas en mesure de redéfinir cette syntaxe.
[ x .. y ]
n'est pas un mot-clé. Derrière les rideaux, il est transformé àenumFromTo x y
, donc il n'y a rien de "magique" à ce sujet.