Avatar ·

Rust中的trait与Haskell中的类型类有什么区别?

大家好! 我在学习Haskell之后开始学习Rust,注意到Rust中的trait与Haskell中的类型类(typeclasses)非常相似。乍一看,它们解决的是同一个问题——允许为不同类型定义通用行为。但我感觉它们之间存在一些根本性的差异,而我目前还无法清晰地表述出来。 例如,在Haskell中我可以这样写: ```haskell class Show a where show :: a -> String instance Show Int where show x = "Int: " ++ show x ``` 而在Rust中,类似的写法是这样的: ```rust trait Show { fn show(&self) -> String; } impl Show for i32 { fn show(&self) -> String { format!("i32: {}", self) } } ``` 看起来差不多,但我注意到几点: 1. 在Haskell中,类型类可以有多个参数(例如 `class Convert a b`),而在Rust中,trait似乎总是绑定到一个类型上。 2. 在Haskell中有 `deriving`,它可以自动为某些类型生成实现。