类别的定义

类别 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)