Avatar ·

En quoi les traits en Rust diffèrent-ils des classes de types en Haskell ?

Bonjour à tous ! Je code en Rust depuis environ six mois, et j'ai récemment commencé à apprendre Haskell. J'ai remarqué que les traits en Rust ressemblent beaucoup aux classes de types (typeclasses) en Haskell, mais je sens qu'il existe des différences fondamentales que je ne comprends pas encore complètement. Par exemple, en Rust, je peux écrire ce code : ```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()); } ``` En Haskell, d'après ce que je comprends, l'équivalent ressemble à ceci : ```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) ``` Mais j'ai remarqué plusieurs choses étranges : 1. En Rust, je peux implémenter un trait pour des types externes (par exemple, pour `i32`), si le trait est défini dans ma crate. En Haskell, autant