A class for categories.
In mathematics, a category is defined as a collection of objects and a collection
of morphisms between objects, together with an identity morphism id for every
object and an operation (.) that composes compatible morphisms.
This class is defined in an analogous way. The collection of morphisms is represented
by a type parameter cat, which has kind k -> k -> Type for some kind variable k
that represents the collection of objects; most of the time the choice of k will be
Type.
Examples
As the method names suggest, there's a category of functions:
instance Category (->) where
id = \x -> x
f . g = \x -> f (g x)
Isomorphisms form a category as well:
data Iso a b = Iso (a -> b) (b -> a)
instance Category Iso where
id = Iso id id
Iso f1 g1 . Iso f2 g2 = Iso (f1 . f2) (g2 . g1)
Natural transformations are another important example:
newtype f ~> g = NatTransform (forall x. f x -> g x)
instance Category (~>) where
id = NatTransform id
NatTransform f . NatTransform g = NatTransform (f . g)
Using the TypeData language extension, we can also make a category where k isn't
Type, but a custom kind Door instead:
type data Door = DoorOpen | DoorClosed
data Action (before :: Door) (after :: Door) where
DoNothing :: Action door door
OpenDoor :: Action start DoorClosed -> Action start DoorOpen
CloseDoor :: Action start DoorOpen -> Action start DoorClosed
instance Category Action where
id = DoNothing
DoNothing . action = action
OpenDoor rest . action = OpenDoor (rest . action)
CloseDoor rest . action = CloseDoor (rest . action)
Methods
Instances6Category
Category OpDefined in base-4.23.0.0 · Data.Functor.ContravariantMonad m => Category (Kleisli m)Defined in ghc-internal-10.0.0 · GHC.Internal.Control.ArrowCategory CoercionDefined in ghc-internal-10.0.0 · GHC.Internal.Control.CategoryCategory (:~:)Defined in ghc-internal-10.0.0 · GHC.Internal.Control.CategoryCategory (:~~:)Defined in ghc-internal-10.0.0 · GHC.Internal.Control.CategoryCategory (->)Defined in ghc-internal-10.0.0 · GHC.Internal.Control.Category