Avatar ·

¿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