fact: Fixpoint retract {S : Type} `(fr : CFree P a) : (forall s : S, (P s -> a) -> a) -> a := fun c => match fr with | CPure x => x | CJoin s k => c s $ fun t => retract (k t) c end.
imports: Hask.Prelude Control.Monad Control.Comonad