¿En qué se diferencian los traits en Rust de las typeclasses en Haskell?
¡Hola a todos! Llevo escribiendo en Rust unos seis meses, y recientemente empecé a estudiar Haskell. Noté que los traits en Rust son muy similares a las typeclasses en Haskell, pero siento que hay diferencias fundamentales entre ellos que aún no comprendo del todo.
Por ejemplo, en Rust puedo escribir este 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());
}
```
En Haskell, según entiendo, el análogo se ve así:
```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)
```
Pero noté varias cosas extrañas:
1. En Rust puedo implementar un trait para tipos externos (por ejemplo, para `i32`) si el trait está definido en mi crate. En Haskell, hasta donde