Avatar ·

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中,据我所知...