Avatar ·

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