類別理論作為組織抽象的系統
範疇理論是一種現代數學理論,是抽象代數的一個分支,側重於連通性和關係的本質。它為許多高度可重用的程式設計抽象提供堅實的基礎和通用語言非常有用。Haskell 使用類別理論作為標準庫和幾個流行的第三方庫中可用的一些核心型別類的靈感。
一個例子
Functor
型別類說如果 F
型別例項化 Functor
(我們為其寫了 Functor F
)那麼我們有一個泛型操作
fmap :: (a -> b) -> (F a -> F b)
這讓我們對映了 F
。標準(但不完美)的直覺是 F a
是一個充滿 a
型別值的容器,fmap
允許我們對每個包含的元素應用轉換。一個例子是 Maybe
instance Functor Maybe where
fmap f Nothing = Nothing -- if there are no values contained, do nothing
fmap f (Just a) = Just (f a) -- else, apply our transformation
鑑於這種直覺,一個常見的問題是“為什麼不把 Functor
稱為像 Mappable
這樣明顯的東西?”。
一種類別理論的暗示
原因是 Functor 適用於類別理論中的一組共同結構,因此通過呼叫 Functor``Functor
,我們可以看到它如何連線到這個更深層次的知識體系。
特別是,類別理論高度關注箭頭從一個地方到另一個地方的想法。在 Haskell 中,最重要的一組箭頭是功能箭頭 a -> b
。在類別理論中研究的一個常見問題是一組箭頭如何與另一組相關聯。特別是,對於任何型別的建構函式 F
,形狀 F a -> F b
的箭頭組也很有趣。
因此,一個 Functor 是任何 F
,正常的 Haskell 箭頭 a -> b
和 F
特定的箭頭 F a -> F b
之間存在聯絡。連線由 fmap
定義,我們也認識到必須遵守的一些準則
forall (x::F a) . fmap id x == x
forall (f::a -> b) (g::b -> c) . fmap g . fmap f = fmap (g . f)
所有這些定律都源於對 Functor
的類別理論解釋,如果我們只認為 Functor
與對映元素有關,那麼這些定律就不那麼明顯了。