Au niveau de base, il n'y a pas beaucoup de différence, mais ils sont toujours là.
Haskell décrit les fonctions ou les valeurs définies dans une classe de types comme des «méthodes», tout comme les traits décrivent les méthodes POO dans les objets qu'ils renferment. Cependant, Haskell les traite différemment, les traitant comme des valeurs individuelles plutôt que de les épingler à un objet comme la POO le conduirait à le faire. Il s'agit de la différence la plus évidente au niveau de la surface.
La seule chose que Rust ne pouvait pas faire pendant un certain temps était les traits typés d'ordre supérieur , tels que les fameuses classes Functor
et les Monad
classes de types.
Cela signifie que les traits Rust ne pouvaient décrire que ce qu'on appelle souvent un «type concret», en d'autres termes, un sans argument générique. Haskell pouvait dès le départ créer des classes de types d'ordre supérieur qui utilisent des types similaires à la façon dont les fonctions d'ordre supérieur utilisent d'autres fonctions: en utilisant l'une pour en décrire une autre. Pendant un certain temps, cela n'a pas été possible dans Rust, mais depuis que les éléments associés ont été mis en œuvre, ces caractéristiques sont devenues courantes et idiomatiques.
Donc, si nous ignorons les extensions, elles ne sont pas exactement les mêmes, mais chacune peut se rapprocher de ce que l'autre peut faire.
Il est également mentionné, comme indiqué dans les commentaires, que GHC (le compilateur principal de Haskell) prend en charge d'autres options pour les classes de types, y compris les classes de types à paramètres multiples (c'est -à- dire de nombreux types impliqués) et les dépendances fonctionnelles , une belle option qui permet des calculs au niveau du type et mène aux familles de types . À ma connaissance, Rust n'a ni funDeps ni familles de types, bien que cela puisse se produire à l'avenir. †
Dans l'ensemble, les traits et les classes de types ont des différences fondamentales qui, en raison de la façon dont ils interagissent, les font agir et semblent assez similaires à la fin.
† Un bel article sur les classes de types de Haskell (y compris les classes les plus typées) peut être trouvé ici , et le chapitre Rust by Example sur les traits peut être trouvé ici
class Functor f where fmap :: (a -> b) -> (f a -> f b)
; un exemple de ce dernier estclass Bounded a where maxBound :: a
.