На базовом уровне особой разницы нет, но они все еще есть.
Haskell описывает функции или значения, определенные в классе типов, как «методы», так же, как черты описывают методы ООП в объектах, которые они включают. Тем не менее, Haskell работает с ними по-разному, рассматривая их как отдельные значения, а не прикрепляя их к объекту, как это может привести ООП. Это примерно самая очевидная разница на уровне поверхности.
Единственное, что Руст не мог сделать какое-то время , это типизированные черты высшего порядка , такие как печально известные Functor
и Monad
классы типов.
Это означает, что признаки Rust могут описывать только то, что часто называют «конкретным типом», другими словами, тип без общего аргумента. Haskell с самого начала мог создавать классы типов высшего порядка, которые используют типы, аналогичные тому, как функции высшего порядка используют другие функции: используя одну для описания другой. В течение некоторого времени это было невозможно в Rust, но, поскольку связанные элементы были реализованы, такие черты стали обычным и идиоматическим.
Поэтому, если мы игнорируем расширения, они не совсем одинаковы, но каждое из них может приблизительно соответствовать тому, что может сделать другое.
Также следует упомянуть, как сказано в комментариях, что GHC (основной компилятор Haskell) поддерживает дополнительные параметры для классов типов, включая многопараметрические (т.е. включающие много типов) классы типов и функциональные зависимости , прекрасный вариант, который допускает вычисления на уровне типов и приводит к типу семей . Насколько мне известно, у Rust нет ни funDeps, ни семейства типов, хотя это может произойти в будущем. †
В целом, черты и классы типов имеют фундаментальные различия, которые из-за того, как они взаимодействуют, заставляют их действовать и в конечном итоге кажутся довольно похожими.
† Хорошая статья о классах типов Хаскелла (включая более типизированные) может быть найдена здесь , и глава Rust by Example о чертах может быть найдена здесь
class Functor f where fmap :: (a -> b) -> (f a -> f b)
; Примером последнего являетсяclass Bounded a where maxBound :: a
.