Built with Alectryon, running Coq+SerAPI v8.16.0+0.16.3. Bubbles () indicate interactive fragments: hover for details, tap to reveal contents. Use Ctrl+↑ Ctrl+↓ to navigate, Ctrl+🖱️ to focus. On Mac, use instead of Ctrl.
From Tealeaves Require Import
  Classes.Categorical.DecoratedMonad
  Classes.Kleisli.DecoratedMonad
  Adapters.CategoricalToKleisli.DecoratedMonad
  Adapters.KleisliToCategorical.DecoratedMonad.

Import Product.Notations.
Import Kleisli.Monad.Notations.
Import Kleisli.Comonad.Notations.
Import Kleisli.DecoratedMonad.Notations.

#[local] Generalizable Variable T W.

(** * Categorical ~> Kleisli ~> Categorical *)
(**********************************************************************)
Module decorated_monad_categorical_kleisli_categorical.

  Context
    `{mapT: Map T}
    `{decT: Decorate W T}
    `{joinT: Join T}
    `{retT: Return T}
    `{Monoid W}
    `{! Categorical.DecoratedMonad.DecoratedMonad W T}.

  Definition bindd': Bindd W T T :=
    DerivedOperations.Bindd_Categorical W T.

  Definition map2: Map T :=
    DerivedOperations.Map_Bindd W T T (Bindd_WTU := bindd').
  Definition dec2: Decorate W T :=
    DerivedOperations.Decorate_Bindd W T (Bindd_WTT := bindd').
  Definition join2: Join T :=
    DerivedOperations.Join_Bindd W T (Bindd_WTT := bindd').

  

mapT = map2

mapT = map2

mapT = DerivedOperations.Map_Bindd W T T

mapT = (fun (A B : Type) (f : A -> B) => bindd (ret ∘ f ∘ extract))

mapT = (fun (A B : Type) (f : A -> B) => bindd' A B (ret ∘ f ∘ extract))

mapT = (fun (A B : Type) (f : A -> B) => DerivedOperations.Bindd_Categorical W T A B (ret ∘ f ∘ extract))

mapT = (fun (A B : Type) (f : A -> B) => join ∘ map (ret ∘ f ∘ extract) ∘ dec T)
A, B: Type
f: A -> B

mapT A B f = join ∘ map (ret ∘ f ∘ extract) ∘ dec T
A, B: Type
f: A -> B

mapT A B f = join ∘ (map (ret ∘ f) ∘ map extract) ∘ dec T
A, B: Type
f: A -> B

mapT A B f = join ∘ map (ret ∘ f) ∘ map extract ∘ dec T
A, B: Type
f: A -> B

mapT A B f = join ∘ map (ret ∘ f) ∘ (map extract ∘ dec T)
A, B: Type
f: A -> B

mapT A B f = join ∘ map (ret ∘ f) ∘ id
A, B: Type
f: A -> B

mapT A B f = join ∘ (map ret ∘ map f) ∘ id
A, B: Type
f: A -> B

mapT A B f = join ∘ map ret ∘ map f ∘ id
A, B: Type
f: A -> B

mapT A B f = id ∘ map f ∘ id
reflexivity. Qed.

decT = dec2

decT = dec2

decT = DerivedOperations.Decorate_Bindd W T

decT = (fun A : Type => bindd ret)

decT = (fun A : Type => bindd' A (W * A) ret)

decT = (fun A : Type => DerivedOperations.Bindd_Categorical W T A (W * A) ret)

decT = (fun A : Type => join ∘ map ret ∘ dec T)
A: Type

decT A = join ∘ map ret ∘ dec T
A: Type

decT A = id ∘ dec T
reflexivity. Qed.

joinT = join2

joinT = join2

joinT = DerivedOperations.Join_Bindd W T

joinT = (fun A : Type => bindd extract)

joinT = (fun A : Type => bindd' (T A) A extract)

joinT = (fun A : Type => DerivedOperations.Bindd_Categorical W T (T A) A extract)

joinT = (fun A : Type => join ∘ map extract ∘ dec T)
A: Type

joinT A = join ∘ map extract ∘ dec T
A: Type

joinT A = join ∘ (map extract ∘ dec T)
A: Type

joinT A = join ∘ id
reflexivity. Qed. End decorated_monad_categorical_kleisli_categorical. (** * Kleisli ~> Categorical ~> Kleisli *) (**********************************************************************) Module decorated_monad_kleisli_categorical_kleisli. Context `{binddT: Bindd W T T} `{retT: Return T} `{Monoid W} `{@Kleisli.DecoratedMonad.DecoratedMonad W T _ _ retT binddT}. Definition map': Map T := DerivedOperations.Map_Bindd W T T. Definition dec': Decorate W T := DerivedOperations.Decorate_Bindd W T. Definition join': Join T := DerivedOperations.Join_Bindd W T. Definition bindd2: Bindd W T T := DerivedOperations.Bindd_Categorical W T (Map_T := map') (Join_T := join') (Decorate_WT := dec').

binddT = bindd2

binddT = bindd2

binddT = DerivedOperations.Bindd_Categorical W T

binddT = (fun (A B : Type) (f : W * A -> T B) => join ∘ map f ∘ dec T)

binddT = (fun (A B : Type) (f : W * A -> T B) => DerivedOperations.Join_Bindd W T B ∘ DerivedOperations.Map_Bindd W T T (W * A) (T B) f ∘ DerivedOperations.Decorate_Bindd W T A)

binddT = (fun (A B : Type) (f : W * A -> T B) => DerivedOperations.Join_Bindd W T B ∘ bindd (ret ∘ f ∘ extract) ∘ DerivedOperations.Decorate_Bindd W T A)

binddT = (fun (A B : Type) (f : W * A -> T B) => bindd extract ∘ bindd (ret ∘ f ∘ extract) ∘ DerivedOperations.Decorate_Bindd W T A)

binddT = (fun (A B : Type) (f : W * A -> T B) => bindd extract ∘ bindd (ret ∘ f ∘ extract) ∘ bindd ret)
A, B: Type
f: W * A -> T B

binddT A B f = bindd extract ∘ bindd (ret ∘ f ∘ extract) ∘ bindd ret
A, B: Type
f: W * A -> T B

binddT A B f = bindd extract ∘ bindd (ret ∘ f ∘ extract) ∘ bindd ret
A, B: Type
f: W * A -> T B

binddT A B f = bindd (extract ⋆5 ret ∘ f ∘ extract) ∘ bindd ret
A, B: Type
f: W * A -> T B

binddT A B f = bindd ((extract ⋆5 ret ∘ f ∘ extract) ⋆5 ret)
A, B: Type
f: W * A -> T B

f = (extract ⋆5 ret ∘ f ∘ extract) ⋆5 ret
A, B: Type
f: W * A -> T B

f = extract ∘ map f ⋆5 ret
A, B: Type
f: W * A -> T B

f = extract ∘ map f ⋆5 ret ∘ id
A, B: Type
f: W * A -> T B

f = extract ∘ map f ⋆1 id
A, B: Type
f: W * A -> T B

f = map f ∘ extract ⋆1 id
A, B: Type
f: W * A -> T B

f = map f ∘ id
reflexivity. Qed. End decorated_monad_kleisli_categorical_kleisli.