Rust 中的特征似乎至少在表面上与Haskell 中的类型类相似,但是我看到人们写到它们之间存在一些差异。我想知道这些差异到底是什么。
在基本层面上,没有太大区别,但它们仍然存在。
Haskell 将类型类中定义的函数或值描述为“方法”,就像特征描述它们所包含的对象中的 OOP 方法一样。然而,Haskell 以不同的方式处理这些,将它们视为单独的值,而不是像 OOP 那样将它们固定到一个对象上。这是最明显的表面水平差异。
Rust 暂时不能做的一件事是 高阶类型特征Functor,例如臭名昭著的Monad类型类。
Functor
Monad
这意味着 Rust 特征只能描述通常称为“具体类型”的东西,换句话说,就是没有泛型参数的东西。Haskell 从一开始就可以创建高阶类型类,其使用类型类似于高阶函数使用其他函数的方式:使用一个来描述另一个。有一段时间,这在 Rust 中是不可能的,但由于相关项目已经实现,这些特征已经变得司空见惯和惯用语。
因此,如果我们忽略扩展,它们并不完全相同,但每个都可以近似于另一个可以做的事情。
正如评论中所说,还值得一提的是,GHC(Haskell 的主要编译器)支持类型类的更多选项,包括多参数(即涉及许多类型)类型类和功能依赖项,这是一个允许类型级计算的可爱选项, 并导致类型家庭。据我所知,Rust 既没有 funDeps 也没有类型族,尽管将来可能会。”
总而言之,traits 和 typeclass 有根本的区别,由于它们交互的方式,使它们最终表现得非常相似。
’ 一篇关于 Haskell 类型类(包括更高类型的)的好文章可以在这里找到,关于特性的 Rust by Example 章节可以在这里找到