類別的定義

類別 C 包括:

  • 一組名為 Obj(C) 的物件;
  • 這些物件之間的態射集合(稱為 Hom(C))。如果 abObj(C) 中,那麼 Hom(C) 中的態射 f 通常表示為 f : a -> b,而 ab 之間的所有態射的集合表示為 hom(a,b);
  • 一種稱為身份態射的特殊態射 - 對於每一個傳統都存在一個態射的天蠍 14;
  • 一個合成運算子(.),取兩個態射 f : a -> bg : 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 babc 都在 Obj(C)Obj(C) 本身是由表示種類,例如,當 k ~ *,如通常的情況下,物件是型別 - k

Haskell 中類別的規範示例是函式類別:

instance Category (->) where
  id = Prelude.id
  (.) = Prelude..

另一個常見的例子是 MonadKleisli 箭頭:

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)