Le fait que l'ADT sont fermés le rend beaucoup plus facile à écrire total fonctions. Qui sont des fonctions qui produisent toujours un résultat, pour toutes les valeurs possibles de son type, par exemple.
maybeToList :: Maybe a -> [a]
maybeToList Nothing = []
maybeToList (Just x) = [x]
Si Maybe
étaient ouvertes, quelqu'un pourrait ajouter un constructeur supplémentaire et l' maybeToList
fonction serait de se briser.
Dans OO ce n'est pas un problème, quand vous êtes à l'utilisation de l'héritage pour étendre un type, parce que quand vous appelez une fonction pour laquelle il n'y a pas de surcharge, il suffit d'utiliser la mise en œuvre d'une super-classe. I. e., vous pouvez appeler printPerson(Person p)
de bons résultats avec un Student
objet si Student
est une sous-classe de Person
.
En Haskell, vous devez généralement utiliser l'encapsulation et les classes de type lorsque vous en avez besoin à mesure de vos types. Par exemple:
class Eq a where
(==) :: a -> a -> Bool
instance Eq Bool where
False == False = True
False == True = False
True == False = False
True == True = True
instance Eq a => Eq [a] where
[] == [] = True
(x:xs) == (y:ys) = x == y && xs == ys
_ == _ = False
Maintenant, l' ==
la fonction est complètement ouverte, vous pouvez ajouter vos propres types en faisant une instance de l' Eq
classe.
À noter qu'il y a eu des travaux sur l'idée de types de données extensibles, mais ce n'est certainement pas une partie de Haskell encore.