Чем отличаются трейты в Rust от классов типов в Haskell?
الجميع مرحباً! أنا أكتب بلغة Rust منذ حوالي ستة أشهر، وبدأت مؤخراً بتعلم Haskell. لاحظت أن الـ traits في Rust تشبه إلى حد كبير الـ typeclasses في Haskell، لكني أشعر أن هناك اختلافات جوهرية بينهما لم أفهمها تماماً بعد.
على سبيل المثال، في 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 لأنواع خارجية (مثل `i32`)، إذا كان الـ trait معرفاً في crate الخاص بي. في Haskell، بقدر ما