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.

Decorated Monads (Poly)

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);
  }.