Quelle est la différence entre les traits en Rust et les classes de types en Haskell ?
Bonjour, collègues !
J'ai commencé à étudier Rust après Haskell et j'ai remarqué que les traits en Rust ressemblent beaucoup aux classes de types (typeclasses) en Haskell. À première vue, ils résolvent le même problème — permettre de définir un comportement commun pour différents types. Mais je sens qu'il existe des différences fondamentales entre eux que je n'arrive pas encore à formuler clairement.
Par exemple, en Haskell je peux écrire :
```haskell
class Show a where
show :: a -> String
instance Show Int where
show x = "Int: " ++ show x
```
Et en Rust, l'analogue ressemble à ceci :
```rust
trait Show {
fn show(&self) -> String;
}
impl Show for i32 {
fn show(&self) -> String {
format!("i32: {}", self)
}
}
```
Cela semble similaire, mais je remarque plusieurs choses :
1. En Haskell, les classes de types peuvent avoir plusieurs paramètres (par exemple, `class Convert a b`), alors qu'en Rust, les traits semblent toujours liés à un seul type.
2. En Haskell, il y a `deriving` qui génère automatiquement des implémentations pour certains types.