Alors, parfois, j'ai besoin d'écrire une structure de données je ne peux pas trouver sur le Hackage, ou ce que je trouve n'est pas testé ou la qualité des assez pour me faire confiance, ou c'est juste quelque chose que je ne veux pas être une dépendance. Je suis de lecture Okasaki du livre en ce moment, et c'est assez bon pour expliquer comment la conception asymptotiquement rapides des structures de données.
Cependant, je suis en train de travailler spécifiquement avec GHC. Des facteurs constants sont un gros problème pour mes applications. L'utilisation de la mémoire est également un gros problème pour moi. Donc, j'ai des questions spécifiquement sur GHC.
En particulier
- Comment maximiser le partage de nœuds
- Comment réduire l'empreinte mémoire
- Comment éviter l'espace fuites dues à une mauvaise rigueur/la paresse
- Comment obtenir GHC pour produire serré intérieure boucles d'importantes sections de code
J'ai regardé autour de divers endroits sur le web, et j'ai une vague idée de la façon de travailler avec GHC, par exemple, à base de sortie, à l'aide de UNPACK
pragmas, et la comme. Mais je ne suis pas sûr de l'obtenir.
J'ai donc sauté ouvrir mon préféré des structures de données de la bibliothèque, les conteneurs, et regardé les Données.La séquence du module. Je ne peux pas dire que je comprends beaucoup de ce qu'ils font pour faire Seq rapide.
La première chose qui attire mon oeil est la définition de l' FingerTree a
. Je suppose que c'est juste moi d'être familier avec le doigt les arbres. La deuxième chose qui attire mon oeil est tout l' SPECIALIZE
pragmas. J'ai aucune idée de ce qui se passe ici, et je suis très curieux, car ce sont éparpillées dans le code.
De nombreuses fonctions ont également un INLINE
pragma associés avec eux. Je peux deviner ce que cela signifie, mais comment puis-je rendre une décision sur le moment d' INLINE
fonctions?
Les choses deviennent vraiment intéressantes autour de la ligne ~475, une section headered comme "Applicative de la Construction". Ils définissent un newtype wrapper pour représenter l'Identité monade, ils écrivent leur propre copie du strict de l'état monade, et ils ont une fonction définie appelés applicativeTree
qui, apparemment, est spécialisé sur l'Identité monade, ce qui augmente le partage de la sortie de la fonction. Je n'ai aucune idée de ce qui se passe ici. Ce rituel est utilisé pour augmenter de partage?
De toute façon, je ne suis pas sûr qu'il y a beaucoup à apprendre de Données.La séquence. Existe-il d'autres modèle de la "programmes", je peux lire à acquérir la sagesse? J'aimerais vraiment savoir comment à soupe de mes structures de données quand j'ai vraiment besoin d'eux pour aller plus vite. Une chose en particulier est écrit structures de données qui font de fusion facile, et comment aller sur l'écriture d'une bonne fusion des règles.