>module Model.Category where >class CategoryExpr cat where > data Ob cat > data Mor cat > mor_source :: Mor cat -> Ob cat > mor_target :: Mor cat -> Ob cat > identity :: Ob cat -> Mor cat > mor_compose :: Mor cat -> Mor cat -> Mor cat > obj_eq :: Ob cat -> Ob cat -> Bool > mor_reduce :: Mor cat -> Mor cat >composable_morphisms :: (CategoryExpr cat) => Mor cat -> Mor cat -> Bool >composable_morphisms m n = obj_eq (mor_target m) (mor_source n) >data FunctorCat dom cod >instance (CategoryExpr dom, CategoryExpr cod) => CategoryExpr (FunctorCat dom cod) where > data Ob (FunctorCat dom cod) = Functor (Ob dom -> Ob cod) > (Mor dom -> Mor cod) > data Mor (FunctorCat dom cod) = NaturalTransformation (Ob dom -> Mor cod) > mor_source (NaturalTransformation f) = Functor (\obj -> mor_source (f obj)) > (\g -> f (mor_source g)) > mor_target (NaturalTransformation f) = Functor (\obj -> mor_target (f obj)) > (\g -> f (mor_target g)) > identity (Functor f m) = NaturalTransformation (\obj -> identity (f obj)) > mor_compose (NaturalTransformation f) (NaturalTransformation g) = NaturalTransfromation (\a -> mor_compose (f a) (g a)) > obj_eq (Functor f m) (Functor f' m') = -- ???? >data Terminal >instance CategoryExpr Terminal where > data Ob Terminal = TerminalObject > data Mor Terminal = TerminalArrow (Ob Terminal) > mor_source (TerminalArrow x) = x > mor_target (TerminalArrow _) = TerminalObject > identity TerminalObject = TerminalArrow TerminalObject > mor_compose (TerminalArrow _) (TerminalArrow y) = TerminalArrow y > obj_eq TerminalObject TerminalObject = True > mor_reduce z = z