No nível básico, não há muita diferença, mas eles ainda estão lá.
Haskell descreve funções ou valores definidos em uma classe de tipo como 'métodos', assim como os traços descrevem os métodos OOP nos objetos que eles incluem. No entanto, Haskell lida com isso de maneira diferente, tratando-os como valores individuais, em vez de fixá-los a um objeto, como o OOP levaria a pessoa a fazer. Essa é a diferença mais óbvia no nível da superfície que existe.
A única coisa que Rust não pôde fazer por um tempo foram os caracteres tipificados de ordem superior , como as infames Functor
e as Monad
classes tipográficas.
Isso significa que os traços de Rust só poderiam descrever o que é chamado de "tipo concreto", em outras palavras, um sem argumento genérico. Desde o início, Haskell pode criar classes de ordem superior, que usam tipos semelhantes a como as funções de ordem superior usam outras funções: usar uma para descrever outra. Por um período de tempo, isso não foi possível no Rust, mas desde que os itens associados foram implementados, esses traços se tornaram comuns e idiomáticos.
Portanto, se ignorarmos as extensões, elas não serão exatamente iguais, mas cada uma poderá se aproximar do que a outra pode fazer.
Também é mencionável, como dito nos comentários, que o GHC (compilador principal de Haskell) suporta mais opções para classes de tipos, incluindo classes de tipos multiparâmetros (isto é, muitos tipos envolvidos) e dependências funcionais , uma opção adorável que permite cálculos em nível de tipo , e leva a digitar famílias . Que eu saiba, Rust não tem departamentos divertidos nem famílias de tipos, embora possa no futuro. †
Em suma, traços e classes de tipos têm diferenças fundamentais, que devido à maneira como interagem, os fazem agir e parecem bastante semelhantes no final.
† Um bom artigo sobre as classes de tipo de Haskell (incluindo as de tipo mais alto) pode ser encontrado aqui , e o capítulo Rust by Example sobre características pode ser encontrado aqui
class Functor f where fmap :: (a -> b) -> (f a -> f b)
; um exemplo do último éclass Bounded a where maxBound :: a
.