Qual é a diferença entre traits em Rust e typeclasses em Haskell?
Olá, colegas!
Comecei a estudar Rust depois de Haskell e notei que os traits em Rust são muito semelhantes às typeclasses em Haskell. À primeira vista, eles resolvem o mesmo problema — permitem definir comportamento comum para diferentes tipos. Mas sinto que existem diferenças fundamentais entre eles que ainda não consigo articular claramente.
Por exemplo, em Haskell posso escrever:
```haskell
class Show a where
show :: a -> String
instance Show Int where
show x = "Int: " ++ show x
```
E em Rust, o análogo fica assim:
```rust
trait Show {
fn show(&self) -> String;
}
impl Show for i32 {
fn show(&self) -> String {
format!("i32: {}", self)
}
}
```
Parece semelhante, mas noto algumas coisas:
1. Em Haskell, as typeclasses podem ter múltiplos parâmetros (por exemplo, `class Convert a b`), enquanto em Rust os traits parecem estar sempre vinculados a um único tipo.
2. Em Haskell existe `deriving`, que gera automaticamente implementações para alguns