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.DecoratedTraversableMonad
  Classes.Kleisli.DecoratedTraversableMonad
  Adapters.CategoricalToKleisli.DecoratedTraversableMonad
  Adapters.KleisliToCategorical.DecoratedTraversableMonad.

Import Product.Notations.
Import Kleisli.Monad.Notations.

#[local] Generalizable Variable T W.

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

  Context
    `{Monoid W}
    `{mapT: Map T}
    `{distT: ApplicativeDist T}
    `{joinT: Join T}
    `{decorateT: Decorate W T}
    `{Return T}
    `{! Categorical.DecoratedTraversableMonad.DecoratedTraversableMonad W T}.

  #[local] Instance binddt': Binddt W T T :=
    DerivedOperations.Binddt_Categorical W T.

  Definition map': Map T :=
    DerivedOperations.Map_Binddt W T T.
  Definition join': Join T :=
    DerivedOperations.Join_Binddt W T.
  Definition decorate': Decorate W T :=
    DerivedOperations.Decorate_Binddt W T.
  Definition dist': ApplicativeDist T :=
    DerivedOperations.Dist_Binddt W T.

  

mapT = map'

mapT = map'

mapT = DerivedOperations.Map_Binddt W T T

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

mapT = (fun (A B : Type) (f : A -> B) => DerivedOperations.Binddt_Categorical W T (fun A0 : Type => A0) Map_I Pure_I Mult_I A B (ret ∘ f ∘ extract))

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

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

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

mapT A B f = join ∘ id ∘ 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 ∘ map f ∘ map extract) ∘ dec T
A, B: Type
f: A -> B

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

mapT A B f = id ∘ map f ∘ map extract ∘ dec T
A, B: Type
f: A -> B

mapT A B f = map f ∘ map extract ∘ dec T
A, B: Type
f: A -> B

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

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

forall (G : Type -> Type) (Map_G : Map G) (Pure_G : Pure G) (Mult_G : Mult G), Applicative G -> distT G Map_G Pure_G Mult_G = dist' G Map_G Pure_G Mult_G

forall (G : Type -> Type) (Map_G : Map G) (Pure_G : Pure G) (Mult_G : Mult G), Applicative G -> distT G Map_G Pure_G Mult_G = dist' G Map_G Pure_G Mult_G
G: Type -> Type
Map_G: Map G
Pure_G: Pure G
Mult_G: Mult G
H2: Applicative G

distT G Map_G Pure_G Mult_G = dist' G Map_G Pure_G Mult_G
G: Type -> Type
Map_G: Map G
Pure_G: Pure G
Mult_G: Mult G
H2: Applicative G

distT G Map_G Pure_G Mult_G = DerivedOperations.Dist_Binddt W T G Map_G Pure_G Mult_G
G: Type -> Type
Map_G: Map G
Pure_G: Pure G
Mult_G: Mult G
H2: Applicative G

distT G Map_G Pure_G Mult_G = (fun A : Type => binddt (map ret ∘ extract))
G: Type -> Type
Map_G: Map G
Pure_G: Pure G
Mult_G: Mult G
H2: Applicative G

distT G Map_G Pure_G Mult_G = (fun A : Type => DerivedOperations.Binddt_Categorical W T G Map_G Pure_G Mult_G (G A) A (map ret ∘ extract))
G: Type -> Type
Map_G: Map G
Pure_G: Pure G
Mult_G: Mult G
H2: Applicative G

distT G Map_G Pure_G Mult_G = (fun A : Type => map join ∘ dist T G ∘ map (map ret ∘ extract) ∘ dec T)
G: Type -> Type
Map_G: Map G
Pure_G: Pure G
Mult_G: Mult G
H2: Applicative G
A: Type

distT G Map_G Pure_G Mult_G A = map join ∘ dist T G ∘ map (map ret ∘ extract) ∘ dec T
G: Type -> Type
Map_G: Map G
Pure_G: Pure G
Mult_G: Mult G
H2: Applicative G
A: Type

distT G Map_G Pure_G Mult_G A = map join ∘ dist T G ∘ (map (map ret) ∘ map extract) ∘ dec T
G: Type -> Type
Map_G: Map G
Pure_G: Pure G
Mult_G: Mult G
H2: Applicative G
A: Type

distT G Map_G Pure_G Mult_G A = map join ∘ dist T G ∘ (map (map ret) ∘ map extract) ∘ dec T
G: Type -> Type
Map_G: Map G
Pure_G: Pure G
Mult_G: Mult G
H2: Applicative G
A: Type

distT G Map_G Pure_G Mult_G A = map join ∘ dist T G ∘ map (map ret) ∘ map extract ∘ dec T
G: Type -> Type
Map_G: Map G
Pure_G: Pure G
Mult_G: Mult G
H2: Applicative G
A: Type

distT G Map_G Pure_G Mult_G A = map join ∘ (dist T G ∘ map (map ret)) ∘ map extract ∘ dec T
G: Type -> Type
Map_G: Map G
Pure_G: Pure G
Mult_G: Mult G
H2: Applicative G
A: Type

distT G Map_G Pure_G Mult_G A = map join ∘ (dist T G ∘ map ret) ∘ map extract ∘ dec T
G: Type -> Type
Map_G: Map G
Pure_G: Pure G
Mult_G: Mult G
H2: Applicative G
A: Type

distT G Map_G Pure_G Mult_G A = map join ∘ (map ret ∘ dist T G) ∘ map extract ∘ dec T
G: Type -> Type
Map_G: Map G
Pure_G: Pure G
Mult_G: Mult G
H2: Applicative G
A: Type

distT G Map_G Pure_G Mult_G A = map join ∘ (map (map ret) ∘ dist T G) ∘ map extract ∘ dec T
G: Type -> Type
Map_G: Map G
Pure_G: Pure G
Mult_G: Mult G
H2: Applicative G
A: Type

distT G Map_G Pure_G Mult_G A = map join ∘ map (map ret) ∘ dist T G ∘ map extract ∘ dec T
G: Type -> Type
Map_G: Map G
Pure_G: Pure G
Mult_G: Mult G
H2: Applicative G
A: Type
app_functor: Functor G
app_pure_natural: forall (A B : Type) (f : A -> B) (x : A), map f (pure x) = pure (f x)
app_mult_natural: forall (A B C D : Type) (f : A -> C) (g : B -> D) (x : G A) (y : G B), mult (map f x, map g y) = map (map_tensor f g) (mult (x, y))
app_assoc: forall (A B C : Type) (x : G A) (y : G B) (z : G C), map α (mult (mult (x, y), z)) = mult (x, mult (y, z))
app_unital_l: forall (A : Type) (x : G A), map left_unitor (mult (pure tt, x)) = x
app_unital_r: forall (A : Type) (x : G A), map right_unitor (mult (x, pure tt)) = x
app_mult_pure: forall (A B : Type) (a : A) (b : B), mult (pure a, pure b) = pure (a, b)

distT G Map_G Pure_G Mult_G A = map join ∘ map (map ret) ∘ dist T G ∘ map extract ∘ dec T
G: Type -> Type
Map_G: Map G
Pure_G: Pure G
Mult_G: Mult G
H2: Applicative G
A: Type
app_functor: Functor G
app_pure_natural: forall (A B : Type) (f : A -> B) (x : A), map f (pure x) = pure (f x)
app_mult_natural: forall (A B C D : Type) (f : A -> C) (g : B -> D) (x : G A) (y : G B), mult (map f x, map g y) = map (map_tensor f g) (mult (x, y))
app_assoc: forall (A B C : Type) (x : G A) (y : G B) (z : G C), map α (mult (mult (x, y), z)) = mult (x, mult (y, z))
app_unital_l: forall (A : Type) (x : G A), map left_unitor (mult (pure tt, x)) = x
app_unital_r: forall (A : Type) (x : G A), map right_unitor (mult (x, pure tt)) = x
app_mult_pure: forall (A B : Type) (a : A) (b : B), mult (pure a, pure b) = pure (a, b)

distT G Map_G Pure_G Mult_G A = map (join ∘ map ret) ∘ dist T G ∘ map extract ∘ dec T
G: Type -> Type
Map_G: Map G
Pure_G: Pure G
Mult_G: Mult G
H2: Applicative G
A: Type
app_functor: Functor G
app_pure_natural: forall (A B : Type) (f : A -> B) (x : A), map f (pure x) = pure (f x)
app_mult_natural: forall (A B C D : Type) (f : A -> C) (g : B -> D) (x : G A) (y : G B), mult (map f x, map g y) = map (map_tensor f g) (mult (x, y))
app_assoc: forall (A B C : Type) (x : G A) (y : G B) (z : G C), map α (mult (mult (x, y), z)) = mult (x, mult (y, z))
app_unital_l: forall (A : Type) (x : G A), map left_unitor (mult (pure tt, x)) = x
app_unital_r: forall (A : Type) (x : G A), map right_unitor (mult (x, pure tt)) = x
app_mult_pure: forall (A B : Type) (a : A) (b : B), mult (pure a, pure b) = pure (a, b)

distT G Map_G Pure_G Mult_G A = map id ∘ dist T G ∘ map extract ∘ dec T
G: Type -> Type
Map_G: Map G
Pure_G: Pure G
Mult_G: Mult G
H2: Applicative G
A: Type
app_functor: Functor G
app_pure_natural: forall (A B : Type) (f : A -> B) (x : A), map f (pure x) = pure (f x)
app_mult_natural: forall (A B C D : Type) (f : A -> C) (g : B -> D) (x : G A) (y : G B), mult (map f x, map g y) = map (map_tensor f g) (mult (x, y))
app_assoc: forall (A B C : Type) (x : G A) (y : G B) (z : G C), map α (mult (mult (x, y), z)) = mult (x, mult (y, z))
app_unital_l: forall (A : Type) (x : G A), map left_unitor (mult (pure tt, x)) = x
app_unital_r: forall (A : Type) (x : G A), map right_unitor (mult (x, pure tt)) = x
app_mult_pure: forall (A B : Type) (a : A) (b : B), mult (pure a, pure b) = pure (a, b)

distT G Map_G Pure_G Mult_G A = id ∘ dist T G ∘ map extract ∘ dec T
G: Type -> Type
Map_G: Map G
Pure_G: Pure G
Mult_G: Mult G
H2: Applicative G
A: Type
app_functor: Functor G
app_pure_natural: forall (A B : Type) (f : A -> B) (x : A), map f (pure x) = pure (f x)
app_mult_natural: forall (A B C D : Type) (f : A -> C) (g : B -> D) (x : G A) (y : G B), mult (map f x, map g y) = map (map_tensor f g) (mult (x, y))
app_assoc: forall (A B C : Type) (x : G A) (y : G B) (z : G C), map α (mult (mult (x, y), z)) = mult (x, mult (y, z))
app_unital_l: forall (A : Type) (x : G A), map left_unitor (mult (pure tt, x)) = x
app_unital_r: forall (A : Type) (x : G A), map right_unitor (mult (x, pure tt)) = x
app_mult_pure: forall (A B : Type) (a : A) (b : B), mult (pure a, pure b) = pure (a, b)

distT G Map_G Pure_G Mult_G A = id ∘ dist T G ∘ (map extract ∘ dec T)
G: Type -> Type
Map_G: Map G
Pure_G: Pure G
Mult_G: Mult G
H2: Applicative G
A: Type
app_functor: Functor G
app_pure_natural: forall (A B : Type) (f : A -> B) (x : A), map f (pure x) = pure (f x)
app_mult_natural: forall (A B C D : Type) (f : A -> C) (g : B -> D) (x : G A) (y : G B), mult (map f x, map g y) = map (map_tensor f g) (mult (x, y))
app_assoc: forall (A B C : Type) (x : G A) (y : G B) (z : G C), map α (mult (mult (x, y), z)) = mult (x, mult (y, z))
app_unital_l: forall (A : Type) (x : G A), map left_unitor (mult (pure tt, x)) = x
app_unital_r: forall (A : Type) (x : G A), map right_unitor (mult (x, pure tt)) = x
app_mult_pure: forall (A B : Type) (a : A) (b : B), mult (pure a, pure b) = pure (a, b)

distT G Map_G Pure_G Mult_G A = id ∘ dist T G ∘ id
reflexivity. Qed.

joinT = join'

joinT = join'

joinT = DerivedOperations.Join_Binddt W T

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

joinT = (fun A : Type => DerivedOperations.Binddt_Categorical W T (fun A0 : Type => A0) Map_I Pure_I Mult_I (T A) A extract)

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

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

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

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

joinT A = map join ∘ id ∘ id
reflexivity. Qed.

decorateT = decorate'

decorateT = decorate'

decorateT = DerivedOperations.Decorate_Binddt W T

decorateT = (fun A : Type => binddt ret)

decorateT = (fun A : Type => DerivedOperations.Binddt_Categorical W T (fun A0 : Type => A0) Map_I Pure_I Mult_I A (W * A) ret)

decorateT = (fun A : Type => join ∘ dist T (fun A0 : Type => A0) ∘ map ret ∘ dec T)
A: Type

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

decorateT A = join ∘ id ∘ map ret ∘ dec T
A: Type

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

decorateT A = id ∘ dec T
reflexivity. Qed. End Roundtrip1. (** * Kleisli ~> Categorical ~> Kleisli *) (**********************************************************************) Module Roundtrip2. Section section. Context `{Kleisli.DecoratedTraversableMonad.DecoratedTraversableMonad W T}. Definition map': Map T := DerivedOperations.Map_Binddt W T T. Definition dist': ApplicativeDist T := DerivedOperations.Dist_Binddt W T. Definition join': Join T := DerivedOperations.Join_Binddt W T. Definition decorate': Decorate W T := DerivedOperations.Decorate_Binddt W T. Definition binddt2: Binddt W T T := DerivedOperations.Binddt_Categorical W T (H := map') (H0 := decorate') (H2 := join') (H1 := dist'). #[local] Tactic Notation "binddt_to_bindd" := rewrite <- bindd_to_binddt. #[local] Tactic Notation "binddt_to_bindt" := rewrite <- bindt_to_binddt. #[local] Tactic Notation "bindd_to_map" := rewrite <- map_to_bindd. Import Kleisli.DecoratedTraversableMonad.DerivedOperations. Import Kleisli.DecoratedTraversableMonad.DerivedInstances.
W: Type
T: Type -> Type
op: Monoid_op W
unit0: Monoid_unit W
Return_inst: Return T
Bindd_T_inst: Binddt W T T
H: DecoratedTraversableMonad W T

forall (G : Type -> Type) (Map_G : Map G) (Pure_G : Pure G) (Mult_G : Mult G), Applicative G -> @binddt W T T Bindd_T_inst G Map_G Pure_G Mult_G = binddt2 G Map_G Pure_G Mult_G
W: Type
T: Type -> Type
op: Monoid_op W
unit0: Monoid_unit W
Return_inst: Return T
Bindd_T_inst: Binddt W T T
H: DecoratedTraversableMonad W T

forall (G : Type -> Type) (Map_G : Map G) (Pure_G : Pure G) (Mult_G : Mult G), Applicative G -> @binddt W T T Bindd_T_inst G Map_G Pure_G Mult_G = binddt2 G Map_G Pure_G Mult_G
W: Type
T: Type -> Type
op: Monoid_op W
unit0: Monoid_unit W
Return_inst: Return T
Bindd_T_inst: Binddt W T T
H: DecoratedTraversableMonad W T
G: Type -> Type
Map_G: Map G
Pure_G: Pure G
Mult_G: Mult G
H0: Applicative G

@binddt W T T Bindd_T_inst G Map_G Pure_G Mult_G = binddt2 G Map_G Pure_G Mult_G
W: Type
T: Type -> Type
op: Monoid_op W
unit0: Monoid_unit W
Return_inst: Return T
Bindd_T_inst: Binddt W T T
H: DecoratedTraversableMonad W T
G: Type -> Type
Map_G: Map G
Pure_G: Pure G
Mult_G: Mult G
H0: Applicative G
A, B: Type
f: W * A -> G (T B)

binddt f = binddt2 G Map_G Pure_G Mult_G A B f
W: Type
T: Type -> Type
op: Monoid_op W
unit0: Monoid_unit W
Return_inst: Return T
Bindd_T_inst: Binddt W T T
H: DecoratedTraversableMonad W T
G: Type -> Type
Map_G: Map G
Pure_G: Pure G
Mult_G: Mult G
H0: Applicative G
A, B: Type
f: W * A -> G (T B)

binddt f = DerivedOperations.Binddt_Categorical W T G Map_G Pure_G Mult_G A B f
W: Type
T: Type -> Type
op: Monoid_op W
unit0: Monoid_unit W
Return_inst: Return T
Bindd_T_inst: Binddt W T T
H: DecoratedTraversableMonad W T
G: Type -> Type
Map_G: Map G
Pure_G: Pure G
Mult_G: Mult G
H0: Applicative G
A, B: Type
f: W * A -> G (T B)

binddt f = map join ∘ dist T G ∘ map f ∘ dec T
W: Type
T: Type -> Type
op: Monoid_op W
unit0: Monoid_unit W
Return_inst: Return T
Bindd_T_inst: Binddt W T T
H: DecoratedTraversableMonad W T
G: Type -> Type
Map_G: Map G
Pure_G: Pure G
Mult_G: Mult G
H0: Applicative G
A, B: Type
f: W * A -> G (T B)

binddt f = map join ∘ dist T G ∘ binddt (ret ∘ f ∘ extract) ∘ dec T
W: Type
T: Type -> Type
op: Monoid_op W
unit0: Monoid_unit W
Return_inst: Return T
Bindd_T_inst: Binddt W T T
H: DecoratedTraversableMonad W T
G: Type -> Type
Map_G: Map G
Pure_G: Pure G
Mult_G: Mult G
H0: Applicative G
A, B: Type
f: W * A -> G (T B)

binddt f = map join ∘ binddt (map ret ∘ extract) ∘ binddt (ret ∘ f ∘ extract) ∘ dec T
W: Type
T: Type -> Type
op: Monoid_op W
unit0: Monoid_unit W
Return_inst: Return T
Bindd_T_inst: Binddt W T T
H: DecoratedTraversableMonad W T
G: Type -> Type
Map_G: Map G
Pure_G: Pure G
Mult_G: Mult G
H0: Applicative G
A, B: Type
f: W * A -> G (T B)

binddt f = map join ∘ binddt (map ret ∘ extract) ∘ binddt (ret ∘ f ∘ extract) ∘ binddt ret
W: Type
T: Type -> Type
op: Monoid_op W
unit0: Monoid_unit W
Return_inst: Return T
Bindd_T_inst: Binddt W T T
H: DecoratedTraversableMonad W T
G: Type -> Type
Map_G: Map G
Pure_G: Pure G
Mult_G: Mult G
H0: Applicative G
A, B: Type
f: W * A -> G (T B)

binddt f = map join ∘ binddt (map ret ∘ extract) ∘ bindd (ret ∘ f ∘ extract) ∘ binddt ret
W: Type
T: Type -> Type
op: Monoid_op W
unit0: Monoid_unit W
Return_inst: Return T
Bindd_T_inst: Binddt W T T
H: DecoratedTraversableMonad W T
G: Type -> Type
Map_G: Map G
Pure_G: Pure G
Mult_G: Mult G
H0: Applicative G
A, B: Type
f: W * A -> G (T B)

binddt f = map join ∘ binddt (map ret ∘ extract) ∘ bindd (ret ∘ f ∘ extract) ∘ bindd ret
W: Type
T: Type -> Type
op: Monoid_op W
unit0: Monoid_unit W
Return_inst: Return T
Bindd_T_inst: Binddt W T T
H: DecoratedTraversableMonad W T
G: Type -> Type
Map_G: Map G
Pure_G: Pure G
Mult_G: Mult G
H0: Applicative G
A, B: Type
f: W * A -> G (T B)

binddt f = map join ∘ bindt (map ret) ∘ bindd (ret ∘ f ∘ extract) ∘ bindd ret
W: Type
T: Type -> Type
op: Monoid_op W
unit0: Monoid_unit W
Return_inst: Return T
Bindd_T_inst: Binddt W T T
H: DecoratedTraversableMonad W T
G: Type -> Type
Map_G: Map G
Pure_G: Pure G
Mult_G: Mult G
H0: Applicative G
A, B: Type
f: W * A -> G (T B)

binddt f = map join ∘ bindt (map ret) ∘ map f ∘ bindd ret
W: Type
T: Type -> Type
op: Monoid_op W
unit0: Monoid_unit W
Return_inst: Return T
Bindd_T_inst: Binddt W T T
H: DecoratedTraversableMonad W T
G: Type -> Type
Map_G: Map G
Pure_G: Pure G
Mult_G: Mult G
H0: Applicative G
A, B: Type
f: W * A -> G (T B)

binddt f = map join ∘ bindt (map ret) ∘ (map f ∘ bindd ret)
W: Type
T: Type -> Type
op: Monoid_op W
unit0: Monoid_unit W
Return_inst: Return T
Bindd_T_inst: Binddt W T T
H: DecoratedTraversableMonad W T
G: Type -> Type
Map_G: Map G
Pure_G: Pure G
Mult_G: Mult G
H0: Applicative G
A, B: Type
f: W * A -> G (T B)

binddt f = map join ∘ bindt (map ret) ∘ (map f ∘ bindd ret)
W: Type
T: Type -> Type
op: Monoid_op W
unit0: Monoid_unit W
Return_inst: Return T
Bindd_T_inst: Binddt W T T
H: DecoratedTraversableMonad W T
G: Type -> Type
Map_G: Map G
Pure_G: Pure G
Mult_G: Mult G
H0: Applicative G
A, B: Type
f: W * A -> G (T B)

binddt f = map join ∘ bindt (map ret) ∘ bindd (map f ∘ ret)
W: Type
T: Type -> Type
op: Monoid_op W
unit0: Monoid_unit W
Return_inst: Return T
Bindd_T_inst: Binddt W T T
H: DecoratedTraversableMonad W T
G: Type -> Type
Map_G: Map G
Pure_G: Pure G
Mult_G: Mult G
H0: Applicative G
A, B: Type
f: W * A -> G (T B)

binddt f = map join ∘ (bindt (map ret) ∘ bindd (map f ∘ ret))
W: Type
T: Type -> Type
op: Monoid_op W
unit0: Monoid_unit W
Return_inst: Return T
Bindd_T_inst: Binddt W T T
H: DecoratedTraversableMonad W T
G: Type -> Type
Map_G: Map G
Pure_G: Pure G
Mult_G: Mult G
H0: Applicative G
A, B: Type
f: W * A -> G (T B)

binddt f = map join ∘ (bindt (map ret) ∘ bindd (map f ∘ ret))
W: Type
T: Type -> Type
op: Monoid_op W
unit0: Monoid_unit W
Return_inst: Return T
Bindd_T_inst: Binddt W T T
H: DecoratedTraversableMonad W T
G: Type -> Type
Map_G: Map G
Pure_G: Pure G
Mult_G: Mult G
H0: Applicative G
A, B: Type
f: W * A -> G (T B)

binddt f = map join ∘ binddt (bindt (map ret) ∘ (map f ∘ ret))
W: Type
T: Type -> Type
op: Monoid_op W
unit0: Monoid_unit W
Return_inst: Return T
Bindd_T_inst: Binddt W T T
H: DecoratedTraversableMonad W T
G: Type -> Type
Map_G: Map G
Pure_G: Pure G
Mult_G: Mult G
H0: Applicative G
A, B: Type
f: W * A -> G (T B)

binddt f = map join ∘ binddt (bindt (map ret) ∘ map f ∘ ret)
W: Type
T: Type -> Type
op: Monoid_op W
unit0: Monoid_unit W
Return_inst: Return T
Bindd_T_inst: Binddt W T T
H: DecoratedTraversableMonad W T
G: Type -> Type
Map_G: Map G
Pure_G: Pure G
Mult_G: Mult G
H0: Applicative G
A, B: Type
f: W * A -> G (T B)

binddt f = map join ∘ binddt (bindt (map ret ∘ f) ∘ ret)
W: Type
T: Type -> Type
op: Monoid_op W
unit0: Monoid_unit W
Return_inst: Return T
Bindd_T_inst: Binddt W T T
H: DecoratedTraversableMonad W T
G: Type -> Type
Map_G: Map G
Pure_G: Pure G
Mult_G: Mult G
H0: Applicative G
A, B: Type
f: W * A -> G (T B)

binddt f = map join ∘ binddt (map ret ∘ f)
W: Type
T: Type -> Type
op: Monoid_op W
unit0: Monoid_unit W
Return_inst: Return T
Bindd_T_inst: Binddt W T T
H: DecoratedTraversableMonad W T
G: Type -> Type
Map_G: Map G
Pure_G: Pure G
Mult_G: Mult G
H0: Applicative G
A, B: Type
f: W * A -> G (T B)

binddt f = map (binddt extract) ∘ binddt (map ret ∘ f)
W: Type
T: Type -> Type
op: Monoid_op W
unit0: Monoid_unit W
Return_inst: Return T
Bindd_T_inst: Binddt W T T
H: DecoratedTraversableMonad W T
G: Type -> Type
Map_G: Map G
Pure_G: Pure G
Mult_G: Mult G
H0: Applicative G
A, B: Type
f: W * A -> G (T B)

binddt f = map (binddt extract) ∘ binddt (map ret ∘ f)
W: Type
T: Type -> Type
op: Monoid_op W
unit0: Monoid_unit W
Return_inst: Return T
Bindd_T_inst: Binddt W T T
H: DecoratedTraversableMonad W T
G: Type -> Type
Map_G: Map G
Pure_G: Pure G
Mult_G: Mult G
H0: Applicative G
A, B: Type
f: W * A -> G (T B)

binddt f = binddt (kc7 G (fun A : Type => A) extract (map ret ∘ f))
W: Type
T: Type -> Type
op: Monoid_op W
unit0: Monoid_unit W
Return_inst: Return T
Bindd_T_inst: Binddt W T T
H: DecoratedTraversableMonad W T
G: Type -> Type
Map_G: Map G
Pure_G: Pure G
Mult_G: Mult G
H0: Applicative G
A, B: Type
f: W * A -> G (T B)

binddt f = binddt (kc7 G (fun A : Type => A) extract (map ret ∘ f))
W: Type
T: Type -> Type
op: Monoid_op W
unit0: Monoid_unit W
Return_inst: Return T
Bindd_T_inst: Binddt W T T
H: DecoratedTraversableMonad W T
G: Type -> Type
Map_G: Map G
Pure_G: Pure G
Mult_G: Mult G
H0: Applicative G
A, B: Type
f: W * A -> G (T B)

binddt f = binddt (kc3 extract f)
W: Type
T: Type -> Type
op: Monoid_op W
unit0: Monoid_unit W
Return_inst: Return T
Bindd_T_inst: Binddt W T T
H: DecoratedTraversableMonad W T
G: Type -> Type
Map_G: Map G
Pure_G: Pure G
Mult_G: Mult G
H0: Applicative G
A, B: Type
f: W * A -> G (T B)

binddt f = binddt (kc3 (id ∘ extract) f)
W: Type
T: Type -> Type
op: Monoid_op W
unit0: Monoid_unit W
Return_inst: Return T
Bindd_T_inst: Binddt W T T
H: DecoratedTraversableMonad W T
G: Type -> Type
Map_G: Map G
Pure_G: Pure G
Mult_G: Mult G
H0: Applicative G
A, B: Type
f: W * A -> G (T B)

binddt f = binddt (map id ∘ f)
W: Type
T: Type -> Type
op: Monoid_op W
unit0: Monoid_unit W
Return_inst: Return T
Bindd_T_inst: Binddt W T T
H: DecoratedTraversableMonad W T
G: Type -> Type
Map_G: Map G
Pure_G: Pure G
Mult_G: Mult G
H0: Applicative G
A, B: Type
f: W * A -> G (T B)

binddt f = binddt (id ∘ f)
reflexivity. Qed. End section. End Roundtrip2.