Como as traits em Rust diferem das typeclasses em Haskell?
Olá a todos! Escrevo em Rust há cerca de seis meses e recentemente comecei a estudar Haskell. Notei que as traits em Rust são muito semelhantes às typeclasses em Haskell, mas sinto que existem diferenças fundamentais entre elas que ainda não entendo completamente.
Por exemplo, em Rust posso escrever o seguinte código:
```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());
}
```
Em Haskell, pelo que entendo, o análogo seria assim:
```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)
```
Mas notei algumas coisas estranhas:
1. Em Rust, posso implementar uma trait para tipos externos (por exemplo, para `i32`) se a trait for definida no meu crate. Em Haskell, até onde