¿Cuál es la diferencia entre traits en Rust y typeclasses en Haskell?
¡Hola, colegas!
Empecé a estudiar Rust después de Haskell y noté que los traits en Rust son muy similares a las typeclasses en Haskell. A primera vista, resuelven la misma tarea: permiten definir comportamiento común para diferentes tipos. Pero siento que hay diferencias fundamentales entre ellos que aún no puedo formular claramente.
Por ejemplo, en Haskell puedo escribir:
```haskell
class Show a where
show :: a -> String
instance Show Int where
show x = "Int: " ++ show x
```
Y en Rust el análogo se ve así:
```rust
trait Show {
fn show(&self) -> String;
}
impl Show for i32 {
fn show(&self) -> String {
format!("i32: {}", self)
}
}
```
Parece similar, pero noto varias cosas:
1. En Haskell, las typeclasses pueden tener múltiples parámetros (por ejemplo, `class Convert a b`), mientras que en Rust los traits parecen estar siempre vinculados a un solo tipo.
2. En Haskell existe `deriving`, que genera automáticamente implementaciones para algunos