Considérer les Langages Orientés Objet:
La plupart des gens à venir à partir d'une programmation orientée objet arrière-plan, sont familiers avec la commune et des interfaces intuitives en différentes langues, qui capture l'essence de Java Collection
& List
interfaces. Collection
se réfère à une collection d'objets qui ne sont pas nécessairement un ordre naturel et d'indexation. Un List
est une collection qui a un ordre naturel et d'indexation. Ces interfaces abstraites de nombreuses données de la bibliothèque-structures en Java, de même que leur équivalent interfaces dans d'autres langues, et d'une compréhension intime de ces interfaces sont nécessaires pour travailler efficacement avec la plupart des données de la bibliothèque-structures.
Transition à Haskell:
Haskell est un type de système de classe qui agit sur les types, par analogie, à des interfaces des objets. Haskell semble avoir une bien conçue type de classe de la hiérarchie à l'égard de Foncteurs, Applicative, les Monades, etc. lorsque le type égard de la fonctionnalité. Il est évident qu'ils veulent corriger et bien captée par type de classes. Pourtant, quand vous regardez beaucoup de Haskell conteneurs (List
,Map
,Sequence
,Set
,Vector
), ils étaient presque tous très similaires (ou identiques) fonctions, mais ne sont pas une abstraction par type de classes.
Quelques Exemples:
-
null
pour le test de "vide" -
length
/size
pour l'élément de comptage -
elem
/member
pour l'ensemble de l'inclusion -
empty
et/ousingleton
pour défaut de construction -
union
pour l'ensemble de l'union -
(\\)
/diff
de différence -
(!)
/(!!)
dangereux pour l'indexation (fonction partielle) -
(!?)
/lookup
pour la sécurité de l'indexation (total de la fonction)
Si je veux utiliser l'une des fonctions ci-dessus, mais j'ai importé deux ou plusieurs récipients je dois commencer à cacher fonctions à partir des modules importés, ou explicitement importer uniquement les fonctions nécessaires à partir de modules ou de qualification les modules importés. Mais étant donné que toutes les fonctions fournissent la même fonctionnalité logique, il semble juste comme une corvée. Si les fonctions ont été définies à partir de type de classes, et non pas séparément dans chaque module, le compilateur de l'inférence de type mécanique pourrait résoudre ce problème. Il permettrait également de commutation des conteneurs sous-jacents simple aussi longtemps que ils ont partagé le type de cours (c'est à dire: vous permet de simplement utiliser un Sequence
au lieu de List
pour un meilleur accès aléatoire de l'efficacité).
Pourquoi ne pas Haskell ont un Collection
et/ou Indexable
type de classe(es) pour unifier & généraliser certaines de ces fonctions?