rust 色中的Traits看起来至少表面上与哈斯克尔中的typeclasses相似,但我看到人们写道,它们之间存在一些差异.我想知道这些区别到底是什么.
rust 色中的Traits看起来至少表面上与哈斯克尔中的typeclasses相似,但我看到人们写道,它们之间存在一些差异.我想知道这些区别到底是什么.
在基本层面上,差别不大,但仍然存在.
Haskell将typeclass中定义的函数或值描述为"方法",就像traits在它们所包含的对象中描述OOP方法一样.然而,Haskell以不同的方式处理这些问题,将它们视为单独的值,而不是像OOP那样将它们固定到对象上.这是最明显的地表差异.
Rust暂时做不到的一件事是higher-order typed traits,比如臭名昭著的Functor
和Monad
类型类.
这意味着 rust 病特征只能描述通常被称为"混凝土类型"的东西,换句话说,一种没有通用参数的类型.Haskell从一开始就可以创建高阶类型类,这些类使用的类型与高阶函数使用其他函数的方式类似:使用一个函数来描述另一个函数.有一段时间,这在Rust中是不可能实现的,但自从associated items个已经实现以来,这样的特性已经变得司空见惯.
因此,如果我们忽略扩展,它们并不完全相同,但每个扩展都可以近似于另一个扩展.
还值得一提的是,正如 comments 中所说,GHC(Haskell的主要编译器)支持类型类的进一步选项,包括multi-parameter个(即涉及许多类型)类型类,以及functional dependencies,这是一个可爱的选项,允许进行类型级计算,并导致type families个.据我所知,Rust既没有funDeps家族,也没有type家族,尽管将来可能会出现.†
总而言之,trait 和类型有着根本的区别,这是因为它们相互作用的方式,使它们的行为最终看起来非常相似.
†关于Haskell的TypeClass(包括更高类型的)的一篇好文章可以在here中找到,关于特性的Rust by Example章节可以在here中找到