28 votes

Pourquoi les bibliothèques standard Haskell n'utilisent-elles pas davantage le polymorphisme?

Je suis dans le processus d'apprentissage Haskell, et les classes de type sembler comme un moyen puissant de faire des type-safe fonctions polymorphes. Mais beaucoup de Haskell Prélude fonctions ne les utilisez pas. Plus précisément:

  • La plupart de la liste des fonctions ne fonctionnent pas avec d'autres structures de données (par exemple, foldr et length sont mis en œuvre pour les listes et ne peut pas être utilisé sur les tableaux).

  • Des Modules comme Data.ByteString sont inutilisables, sauf si vous utilisez import qualified car elles contiennent des fonctions qui ont le même nom que le Prélude de fonctions.

Il semble que ces deux problèmes pourraient disparaître si la bibliothèque standard utilisé des fonctions génériques avec des classes de type (s'il vous plaît laissez-moi savoir si je suis complètement à côté de la base à ce sujet).

J'ai deux questions:

  1. Quelles sont les caractéristiques techniques ou de conception raisons que le Prélude est comme ça, ou est-ce juste pour des raisons historiques?

  2. En regardant autour, il semble qu'il y a quelques bibliothèques (comme Data.Foldable et, si je ne suis pas trompe, des déchets de Votre passe-partout) pour remplacer le standard Prélude fonctions avec des solutions de rechange génériques. Sont il y a des plans pour intégrer ces idées dans les futures versions de Haskell?

19voto

stephen tetley Points 3622

Il ya une très bonne raison pragmatique que "standard" Haskell (Prélude de base + + peut-être un peu plus) ne pas utiliser plus de polymorphisme:

La conception générale,-le type d'utilisation des classes est dur. De bons modèles pour les classes abstraites sur les types de conteneurs comme des listes, des tableaux et des "bytestrings" (personnellement, je n'ai pas vraiment envisager de Bytestring un conteneur) ne sont pas flottante ronde en attente d'être inclus dans Haskell 2012. Il y a quelques dessins de l'e.g Listlike et l'Edison classes, et un certain nombre de personnes ont taillé le problème, mais à l'exception Pliable et Traversable, personne n'a produit aucun des designs convaincants.

11voto

Antoine Latter Points 1315

La bibliothèque de base Haskell était autrefois plus polymorphe - les compréhensions de liste utilisées pour n'importe quelle monade, map et ++ n'étaient pas limitées à List, et peut-être à d'autres choses.

Mais les gens à l'époque pensaient que cela conduisait à des messages d'erreur déroutants pour les débutants et que les gens qui ne sont pas débutants peuvent utiliser les versions spécifiquement polymorphes.

8voto

Thomas M. DuBuisson Points 31851
  1. Alors qu'il y a beaucoup de choses dans la base, et plus précisément Prélude, qui sont historiques, je pense que toute généralisation serait de voir beaucoup de technique de push-back. Le principal problème est la vitesse - si vous êtes de la fonction de la classe du type de contrainte, alors vous allez être de passage autour d'un dictionnaire pour le type de fonctions de classe et peut-être manger plus d'espace pour la spécialisation.

  2. Certaines bibliothèques, comme SYB, utilisez des extensions qui ne font pas partie de Haskell. La première tâche serait de formaliser et de renforcer le soutien à ces caractéristiques. Regarder le Haskell documents pour voir où Haskell se passe et comment vous pourriez être en mesure d'exercer une influence sur le chemin.

6voto

Nefrubyr Points 3059

Real World Haskell a quelques idées à ce sujet dans la Monade Transformateurs chapitre:

Dans un monde idéal, serait de nous faire une rupture avec le passé, et passer de l'un Prélude à utiliser Traversable et Pliable types? Probablement pas. Apprendre Haskell est déjà un stimulant assez d'aventure pour les nouveaux arrivants. Le Pliable et Traversable abstractions sont faciles à ramasser quand nous l'avons déjà comprendre les foncteurs et les monades, mais qu'ils allaient mettre les jeunes apprenants sur trop pure un régime de l'abstraction. Pour l'enseignement de la langue, il est bon que la carte fonctionne sur les listes, pas sur les foncteurs.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X