ما الفرق بين traits في Rust و typeclasses في Haskell؟
مرحبًا، زملائي!
بدأت تعلم Rust بعد Haskell ولاحظت أن traits في Rust تشبه إلى حد كبير typeclasses في Haskell. للوهلة الأولى، يحلان نفس المشكلة — يسمحان بتحديد سلوك مشترك لأنواع مختلفة. لكني أشعر أن هناك اختلافات جوهرية بينهما لم أستطع صياغتها بوضوح بعد.
على سبيل المثال، في 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، يمكن أن تحتوي typeclasses على معاملات متعددة (مثل `class Convert a b`)، بينما في Rust يبدو أن traits مرتبطة دائمًا بنوع واحد.
2. في Haskell يوجد `deriving` الذي يولد تلقائيًا تطبيقات لبعض الـ