Rust में ट्रेट्स Haskell में टाइपक्लासेज़ से कैसे भिन्न हैं?
सभी को नमस्कार! मैं लगभग छह महीने से Rust में लिख रहा हूँ, और हाल ही में Haskell सीखना शुरू किया है। मैंने देखा कि Rust में ट्रेट्स 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 में मैं बाहरी टाइप्स (जैसे `i32`) के लिए ट्रेट इम्प्लीमेंट कर सकता हूँ, अगर ट्रेट मेरे क्रेट में डिफ़ाइन किया गया हो। Haskell में, जहाँ तक