类型类
Haskell 中的类型类(Type Class)类似于其他编程语言中的接口(interface)。类型类定义了一组行为(即函数的集合),当一个类型成为某个类型类的实例时,它就必须实现这些行为。类型类用于抽象和泛型编程,使代码更具通用性。
简单例子:Eq 类型类
Eq
是 Haskell 中一个常见的类型类,表示可以比较相等性的类型。
class Eq a where
(==) :: a -> a -> Bool
(/=) :: a -> a -> Bool
Eq
类型类定义了两个函数 (==)
和 (/=)
,用于判断两个同类型的值是否相等或不等。任何类型如果想成为 Eq
的实例,都必须实现这两个函数。
为自定义类型实现 Eq
类型类:
假设我们有一个简单的数据类型 Color
:
data Color = Red | Green | Blue
我们可以让 Color
类型成为 Eq
的实例,实现它的 (==)
和 (/=)
:
instance Eq Color where
Red == Red = True
Green == Green = True
Blue == Blue = True
_ == _ = False
现在我们可以比较颜色:
main = do
print (Red == Green) -- 输出 False
print (Blue == Blue) -- 输出 True
常见类型类
- Eq:比较相等性。
- Ord:定义顺序(如
<
、>
等操作)。 - Show:将类型转换为字符串,类似于
toString
。 - Read:从字符串解析出类型值。
当你定义一个类型时,Haskell 可以尽力自动派生一个类型类。以下是定义 Icecream 类型但派生 Show 的语法。
data Icecream = Chocolate | Vanilla deriving (Show)
GHCi> Chocolate
Chocolate
GHCi> Vanilla
Vanilla
data Icecream = Chocolate | Vanilla deriving (Show, Eq, Ord)
GHCi> Vanilla == Vanilla
True
GHCi> Chocolate == Vanilla
False
GHCi> Chocolate /= Vanilla
True
总结
类型类是 Haskell 用来描述抽象行为的机制,不同类型可以成为某个类型类的实例并实现其所要求的行为。