Skip to content
Go back

类型类

Updated:

类型类

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

常见类型类

  1. Eq:比较相等性。
  2. Ord:定义顺序(如 <> 等操作)。
  3. Show:将类型转换为字符串,类似于 toString
  4. 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 用来描述抽象行为的机制,不同类型可以成为某个类型类的实例并实现其所要求的行为。


Suggest Changes

Previous Post
使用函数式进行面向对象编程
Next Post
类型编程