Tealeaves.Classes.Categorical.DecoratedMonadPoly
From Tealeaves Require Export
Classes.Categorical.DecoratedFunctorPoly
Classes.Categorical.Monad2
Functors.List
Functors.Writer.
#[local] Generalizable Variables T F W A B C.
Classes.Categorical.DecoratedFunctorPoly
Classes.Categorical.Monad2
Functors.List
Functors.Writer.
#[local] Generalizable Variables T F W A B C.
Class DecoratedMonadPoly
(T: Type → Type → Type)
`{Map2 T} `{DecoratePoly T}
`{∀ B, Return (T B)}
`{∀ B, Join (T B)} :=
{
dmp_functor :> Functor2 T;
dmp_decorated :> DecoratedFunctorPoly T;
dmp_monad :> Monad2 T;
dmp_dec_ret: ∀ B V,
decp ∘ ret (T := T B) (A := V) =
ret (T := T (Z B)) (A := L B V) ∘ ret (T := prod (list B));
dmp_dec_join:
∀ (B V: Type),
decp ∘ join (T := T B) (A := V) =
join (T := T (Z B)) ∘ map2 id (shift2 ∘ map_snd decp)
∘ decp (B := B) (V := T B V);
}.
(T: Type → Type → Type)
`{Map2 T} `{DecoratePoly T}
`{∀ B, Return (T B)}
`{∀ B, Join (T B)} :=
{
dmp_functor :> Functor2 T;
dmp_decorated :> DecoratedFunctorPoly T;
dmp_monad :> Monad2 T;
dmp_dec_ret: ∀ B V,
decp ∘ ret (T := T B) (A := V) =
ret (T := T (Z B)) (A := L B V) ∘ ret (T := prod (list B));
dmp_dec_join:
∀ (B V: Type),
decp ∘ join (T := T B) (A := V) =
join (T := T (Z B)) ∘ map2 id (shift2 ∘ map_snd decp)
∘ decp (B := B) (V := T B V);
}.