Avatar ·

Чем отличаются трейты в 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، بقدر ما