<p dir="ltr">1. An explanation of a monoid as a category with exactly one object</p>
<p dir="ltr">newtype Cat c a = Cat {getCat :: c a a}<br>
instance Category c => Monoid (c a)</p>
<p dir="ltr">newtype Mon m a b = Mon {getMon :: m}<br>
instance Monoid m => Category (Mon m)<br>
--This would be more precisely written<br>
-- data Mon m a b where<br>
-- Mon :: m -> Mon a a<br>
-- but that hurts performance without seeming to offer much in return</p>
<p dir="ltr">2.<br>
newtype Op c a b = Op {getOp :: c b a}<br>
instance Category c => Category (Op c)<br>
instance Bifunctor c => Bifunctor (Op c)<br>
instance Bifunctor c => Functor (Op c a)<br>
instance Profunctor c => Contravariant (Op c a)</p>
<p dir="ltr">I see that Control.Category.Dual in the categories package offers a version of this last defined as *data* for some reason.</p>