Rust中的trait与Haskell中的类型类有什么区别?
大家好!
我在学习Haskell之后开始学习Rust,注意到Rust中的trait与Haskell中的类型类(typeclasses)非常相似。乍一看,它们解决的是同一个问题——允许为不同类型定义通用行为。但我感觉它们之间存在一些根本性的差异,而我目前还无法清晰地表述出来。
例如,在Haskell中我可以这样写:
```haskell
class Show a where
show :: a -> String
instance Show Int where
show x = "Int: " ++ show x
```
而在Rust中,类似的写法是这样的:
```rust
trait Show {
fn show(&self) -> String;
}
impl Show for i32 {
fn show(&self) -> String {
format!("i32: {}", self)
}
}
```
看起来差不多,但我注意到几点:
1. 在Haskell中,类型类可以有多个参数(例如 `class Convert a b`),而在Rust中,trait似乎总是绑定到一个类型上。
2. 在Haskell中有 `deriving`,它可以自动为某些类型生成实现。