函數式編程 - Type Class 介紹

什麼是 Type Class ?

Type Class (類型類) 的概念來自 Haskell,表示一系列函數的集合,在概念上, Type Class 和麪向對象領域的泛型接口比較相似。編程

因爲 Haskell 是一門純函數式編程語言,沒有類和接口的概念,因此使用 Type Class 表達相似接口的概念。例如 Haskell 的 Ord 類型類在概念上和 Java 的 Comparable 很是相似。編程語言

在 Haskell 中,Type Class 使用 class 關鍵字定義:函數式編程

class BasicEq a where
    isEqual :: a -> a -> Bool
    isEqual x y = not (isNotEqual x y)

    isNotEqual :: a -> a -> Bool
    isNotEqual x y = not (isEqual x y)

Type Class Instance 則使用 instance 關鍵字定義:函數

instance BasicEq Bool where
    isEqual False False = True
    isEqual True  True  = True
    isEqual _     _     = False

只要定義了 Bool 類型的 Type Class Instance,咱們就能夠在任何地方使用 isEqual 方法比較 Bool 類型的相等性。用面向對象的語言描述就是:Bool 類型實現了 BasicEq 接口。spa

Type Class 的好處是,當系統增長一個新類型時,只須要實現該新類型的 Type Class Instance 便可,已有類型代碼能夠保持不變。scala

Java中的 Type Class

在面向對象領域使用接口解決相似 Type Class 的問題,例如 Java 的 Comparable 接口。可是接口的方式並不優雅,它要求新類型必須實現 Comparable 接口,若是這個新類型來自第三方庫,咱們沒法強制要求它實現 Comparable 接口。因此在面向對象領域,咱們仍然能夠借鑑 Type Class 的方式以解決接口所面臨的問題。因此 Java 提供了一個 Type Class 的等價物,即 Comparator<T>接口,全部實現了Comparator<T>接口的實例即爲 Type Class Instance。針對一個新類型Person,咱們只須要實現一個Comparator<Person>實例,便可以在任何地方對Person集合進行排序。設計

Scala 中的 Type Class

一樣的,Scala 的核心庫設計中也採用了 Type Class 的概念。例如Ordering[T] 是一個 Type Class, IntOrdering 是一個 Type Class Instance。因此只要有IntOrdering實例,咱們就能夠對Int類型進行排序:code

def sorted[B >: A](implicit ord : scala.math.Ordering[B])

因爲Ordering中已經預約了常見的Type Class Instance 的隱式對象,因此咱們能夠在任何地方對常見類型進行排序。對象

相關文章
相關標籤/搜索