类别的定义
类别 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)