Program Definition idM `(As:Setoid A) : Mor As As := Build_Mor As As (@id A) _.
Next Obligation.
hnf; auto.
Qed.
Program Definition composeM `{As:Setoid A} `{Bs:Setoid B} `{Cs:Setoid C}
(f:Mor Bs Cs) `(g:Mor As Bs) := Build_Mor As Cs (fun x => f (g x)) _.
Next Obligation.
hnf; intros.
apply f; apply g; auto.
Qed.
Infix "oo" := composeM (at level 54, right associativity).
Module Type TY_FUNCTOR.
Parameter F : Type -> Type.
Instance Fs : forall {A}, Setoid A -> Setoid (F A).
Parameter fmap : forall `{As:Setoid A} `{Bs:Setoid B}, Mor As Bs -> Mor (Fs As) (Fs Bs).

(* Specifications: *)
Axiom fmap_mor : forall `{As:Setoid A} `{Bs:Setoid B},
Morphism (equiv ==> equiv) fmap.
Axiom fmap_id : forall `{As:Setoid A}, fmap (idM As) == idM (Fs As).
Axiom fmap_comp : forall `{As:Setoid A} `{Bs:Setoid B} `{Cs:Setoid C}
(f:Mor Bs Cs) (g:Mor As Bs),
fmap f oo fmap g == fmap (f oo g).