À grande échelle de conception en Haskell?

Ce qui est un bon moyen de conception/structure de grands programmes fonctionnels, en particulier en Haskell?

J'ai été à travers un tas de tutoriels (Écrire Vous-même un Régime d'être mon préféré, avec Real World Haskell une seconde près) mais la plupart de ces programmes sont relativement petits, et à usage unique. En outre, je ne considère pas certains d'entre eux à être particulièrement élégante (par exemple, la grande tables de recherche dans des VOIES).

Je suis en train de vouloir écrire des programmes plus importants, avec plus de pièces mobiles, - l'acquisition des données à partir d'une variété de sources différentes, le nettoyage, le traitement de différentes façons, en affichant dans les interfaces utilisateur, de conservation, de communication sur les réseaux, etc. Comment pourrait-on mieux la structure du code pour être lisible, maintenable, et adaptable à l'évolution des besoins?

Il n'y a bien un grand de la littérature traitant de ces questions pour les grandes orientée objet de programmes impératifs. Des idées comme MVC, design patterns, etc. sont décents prescriptions pour la réalisation des objectifs généraux tels que la séparation des préoccupations et de la possibilité de réutilisation dans un OO style. En outre, de nouveaux langages impératifs, se prêtent à une "conception de l'as you grow" style de refactoring pour laquelle, dans mon novice avis, Haskell semble moins bien adapté.

Est-il un équivalent de la littérature pour Haskell? Comment est le zoo exotique des structures de contrôle disponibles dans la programmation fonctionnelle (les monades, des flèches, des applicatifs, etc.) mieux employées à cette fin? Quelles sont les meilleures pratiques pouvez-vous recommander?

Merci!

MODIFIER (ce qui est un suivi de Don Stewart réponse):

@enfile mentionné: "les Monades touche de capture des conceptions architecturales dans les types de."

Je suppose que ma question est: comment doit-on penser clé de la conception architecturale dans un langage purement fonctionnel?

Prenons l'exemple de plusieurs flux de données, et un traitement en plusieurs étapes. Je peux écrire modulaire des analyseurs syntaxiques pour le flux de données à un ensemble de structures de données, et je peux mettre en œuvre chaque étape de transformation par une fonction pure. Les étapes de traitement nécessaires pour un morceau de données dépendra de sa valeur et de celle des autres. Certaines des mesures devraient être suivies d'effets secondaires comme GUI mises à jour ou des requêtes de base de données.

Quelle est la "bonne" façon de lier les données et l'analyse des étapes d'une belle manière? On pourrait écrire une grande fonction qui fait la bonne chose pour les différents types de données. Ou on peut utiliser un monade de garder une trace de ce qui a été traitée jusqu'à présent et demandez à chaque étape de la transformation obtenir ce dont il a besoin à côté de la monade de l'état. Ou on pourrait écrire en grande partie des programmes et envoyer des messages autour (je n'aime pas beaucoup cette option).

Les diapositives qu'il a lié avoir un les Choses, nous avons Besoin de puce: "les expressions idiomatiques pour la cartographie de la conception sur le
types/fonctions/classes/monades". Quelles sont les expressions idiomatiques? 🙂

  • Je pense que l'idée de base lors de l'écriture de grands programmes dans un langage fonctionnel est petit, spécialisés, les apatrides et les modules de communication par passage de messages. Bien sûr, vous avez à faire semblant un peu parce qu'un vrai programme besoins de l'état. Je pense que c'est là F# brille au-dessus de Haskell.
  • mais seulement Haskell applique l'apatridie par défaut.Vous n'avez pas le choix, et doivent travailler dur pour introduire de l'état (à briser compositionnalité) en Haskell 🙂
  • Ouais je sais, mais je fais partie de ce meilleur des deux mondes type de gars.
  • Au premier abord, il ressemble à beaucoup de travail, mais vous seriez surpris de voir à quel point il est largement le cadre de différents programmes de l'envoi de messages.
  • Je ne suis pas en désaccord, en théorie. Certes, dans un langage impératif (ou un autre fonctionnel conçu autour de transmission de messages), qui pourrait très bien être ce que j'ai fais. Mais Haskell a d'autres façons de composer avec l'état, et peut-être ils me permettent de garder plus de la "pure" des avantages.
  • J'ai écrit un peu à ce sujet sous "Design Guidelines" dans ce document: community.haskell.org/~ndm/téléchargements/...
  • "Ce qui est une bonne manière de la conception ou de la structure de grands programmes fonctionnels, en particulier en Haskell?". Dans sa présentation, "de l'Ingénierie de Grands Projets en Haskell", Don Stewart dit de Galois ont développé jusqu'à 0,2 MLOC Haskell programmes, qui est minuscule par rapport aux normes modernes (un grand nombre des plus grands du monde des bases de code sont maintenant plus de 10MLOC!). Étant donné que de Galois sont à peu près les seuls grands industriels de l'utilisateur de Haskell dans le monde, je dirais que personne n'a jamais développé un grand Haskell programme ainsi personne ne peut savoir comment structurer un.
  • Notez que vous pouvez faire état dans haskell avec une récursion infinie ou monades par exemple.
  • n'oublions pas que tout MLOC est une bonne mesure lorsque vous comparez des projets en langues similaires, il n'a pas beaucoup de sens pour la croix-langue de comparaison, en particulier avec des langages comme Haskell, où la réutilisation du code et de la modularité est beaucoup plus facile & coffre-fort par rapport à certaines langues.
  • comme Haskell, où la réutilisation du code et de la modularité est beaucoup plus facile & safe". Je trouve que l'énoncé bizarre quand Haskell n'a qu'un vestige de module de système par rapport à ML. Pourquoi il y a au moins deux >1MLOC code OCaml bases dans l'industrie (Jeanne de Saint-laurent et Citrix), mais pas de Haskell ceux?
  • Je ne voulais pas dire 'modularité", comme en Java, il n'était plus sur de ne pas avoir besoin de beaucoup colle le code ou l'optimisation des structures de données lors de l'utilisation de bibliothèques. Peut-être "modularité" n'est pas le mot juste ici. Je n'ai pas de GROS projets en haskell, mais j'ai toujours été étonné de voir comment peu de code, je me retrouve avec quand je sais qu'une bibliothèque probablement gère ses tâches de manière efficace. Je pense que, la plupart de ceci vient de la paresse, de lang. Est OCaml paresseux?
  • OCaml n'est pas paresseux. J'ai étudié plusieurs OSS Haskell bases de code et ne pense pas que la paresse a semblé particulièrement avantageux.
  • Pouvez-vous élaborer sur la façon dont "les monades touche de capture des conceptions architecturales dans les types"?
  • Pourquoi beaucoup de vraiment bonnes questions sont-elles fermées?
  • Matt Parsons a écrit un intéressant billet de blog sur la conception de l'application en Haskell: parsonsmatt.org/2018/03/22/three_layer_haskell_cake.html

InformationsquelleAutor Dan | 2010-06-20