小编典典

Rust 中的特征和 Haskell 中的类型类有什么区别?

all

Rust 中的特征似乎至少在表面上与Haskell
中的类型类相似,但是我看到人们写到它们之间存在一些差异。我想知道这些差异到底是什么。


阅读 73

收藏
2022-07-14

共1个答案

小编典典

在基本层面上,没有太大区别,但它们仍然存在。

Haskell 将类型类中定义的函数或值描述为“方法”,就像特征描述它们所包含的对象中的 OOP 方法一样。然而,Haskell
以不同的方式处理这些,将它们视为单独的值,而不是像 OOP 那样将它们固定到一个对象上。这是最明显的表面水平差异。

Rust 暂时不能做的一件事是 高阶类型特征Functor,例如臭名昭​​著的Monad类型类。

这意味着 Rust 特征只能描述通常称为“具体类型”的东西,换句话说,就是没有泛型参数的东西。Haskell
从一开始就可以创建高阶类型类,其使用类型类似于高阶函数使用其他函数的方式:使用一个来描述另一个。有一段时间,这在 Rust
中是不可能的,但由于相关项目已经实现,这些特征已经变得司空见惯和惯用语。

因此,如果我们忽略扩展,它们并不完全相同,但每个都可以近似于另一个可以做的事情。

正如评论中所说,还值得一提的是,GHC(Haskell
的主要编译器)支持类型类的更多选项,包括多参数(即涉及许多类型)类型类和功能依赖项,这是一个允许类型级计算的可爱选项,
并导致类型家庭。据我所知,Rust 既没有 funDeps
也没有类型族,尽管将来可能会。”

总而言之,traits 和 typeclass 有根本的区别,由于它们交互的方式,使它们最终表现得非常相似。


’ 一篇关于 Haskell
类型类(包括更高类型的)的好文章可以在这里找到,关于特性的
Rust by Example 章节可以在这里找到

2022-07-14