{-# LANGUAGE TypeFamilies, GADTs, RankNTypes, NoImplicitPrelude #-}
-----------------------------------------------------------------------------
-- |
-- Module : Data.Category
-- License : BSD-style (see the file LICENSE)
--
-- Maintainer : sjoerd@w3future.com
-- Stability : experimental
-- Portability : non-portable
-----------------------------------------------------------------------------
module Data.Category (
-- * Category
Category(..)
, Obj
-- * Opposite category
, Op(..)
) where
infixr 8 .
-- | Whenever objects are required at value level, they are represented by their identity arrows.
type Obj k a = k a a
-- | An instance of @Category k@ declares the arrow @k@ as a category.
class Category k where
src :: k a b -> Obj k a
tgt :: k a b -> Obj k b
(.) :: k b c -> k a b -> k a c
-- | The category with Haskell types as objects and Haskell functions as arrows.
instance Category (->) where
src _ = \x -> x
tgt _ = \x -> x
f . g = \x -> f (g x)
data Op k a b = Op { unOp :: k b a }
-- | @Op k@ is opposite category of the category @k@.
instance Category k => Category (Op k) where
src (Op a) = Op (tgt a)
tgt (Op a) = Op (src a)
(Op a) . (Op b) = Op (b . a)