Rust中的trait与Haskell中的类型类有何不同?
大家好!我写Rust大约半年了,最近开始学习Haskell。我注意到Rust中的trait与Haskell中的typeclasses非常相似,但感觉它们之间存在一些根本性的差异,我目前还没有完全理解。
例如,在Rust中我可以写这样的代码:
```rust
trait Speak {
fn speak(&self) -> String;
}
struct Dog;
impl Speak for Dog {
fn speak(&self) -> String {
"Woof!".to_string()
}
}
fn make_speak(animal: T) {
println!("{}", animal.speak());
}
```
在Haskell中,据我所知,类似的形式是这样的:
```haskell
class Speak a where
speak :: a -> String
data Dog = Dog
instance Speak Dog where
speak _ = "Woof!"
makeSpeak :: Speak a => a -> IO ()
makeSpeak animal = putStrLn (speak animal)
```
但我注意到一些奇怪的事情:
1. 在Rust中,如果trait定义在我的crate中,我可以为外部类型(例如`i32`)实现该trait。而在Haskell中,据我所知...