類別的定義
類別 C
包括:
- 一組名為
Obj(C)
的物件; - 這些物件之間的態射集合(稱為
Hom(C)
)。如果a
和b
在Obj(C)
中,那麼Hom(C)
中的態射f
通常表示為f : a -> b
,而a
和b
之間的所有態射的集合表示為hom(a,b)
; - 一種稱為身份態射的特殊態射 - 對於每一個傳統都存在一個態射的天蠍 14;
- 一個合成運算子(
.
),取兩個態射f : a -> b
,g : b -> c
併產生態射a -> c
遵守以下準則:
For all f : a -> x, g : x -> b, then id . f = f and g . id = g
For all f : a -> b, g : b -> c and h : c -> d, then h . (g . f) = (h . g) . f
換句話說,具有身份態射(左側或右側)的構圖不會改變其他態射,並且構圖是關聯的。
在 Haskell 中,Category
被定義為 Control.Category 中的型別類 :
-- | A class for categories.
-- id and (.) must form a monoid.
class Category cat where
-- | the identity morphism
id::cat a a
-- | morphism composition
(.) :: cat b c -> cat a b -> cat a c
在這種情況下,cat::k -> k -> *
客觀化了態射關係 - 當且僅當 cat a b
有人居住時(即有一個值),存在一個態射 cat a b
。a
,b
和 c
都在 Obj(C)
。Obj(C)
本身是由表示種類,例如,當 k ~ *
,如通常的情況下,物件是型別 - k
。
Haskell 中類別的規範示例是函式類別:
instance Category (->) where
id = Prelude.id
(.) = Prelude..
另一個常見的例子是 Monad
的 Kleisli
箭頭:
newtype Kleisli m a b = Kleisli (a -> m b)
class Monad m => Category (Kleisli m) where
id = Kleisli return
Kleisli f . Kleisli g = Kleisli (f >=> g)