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.Kleisli.TraversableMonad
  Classes.Coalgebraic.TraversableMonad
  Functors.Early.Batch.

Import Batch.Notations.
Import Applicative.Notations.
Import TraversableMonad.Notations.

#[local] Generalizable Variables T G ϕ.

(** * Kleisli Traversable Monad from Kleisli Traversable Monad *)
(**********************************************************************)

(** ** Derived Operation <<toBatch6>> *)
(**********************************************************************)
Module DerivedOperations.

  #[export] Instance Bindt_ToBatch6
    (T U: Type -> Type) `{ToBatch6 T U}: Bindt T U :=
  fun G _ _ _ A B f => runBatch (G := G) f (C := U B) ∘ toBatch6.

End DerivedOperations.

Module DerivedInstances.

  Import DerivedOperations.

  Section with_algebra.

    Context
      `{Coalgebraic.TraversableMonad.TraversableMonad T}.

    (** ** <<⋆6>> as <<runBatch ∘ map runBatch ∘ double_batch6>> *)
    (******************************************************************)
    
T: Type -> Type
H: Return T
H0: ToBatch6 T T
H1: TraversableMonad T
A, B, C: Type
G1, G2: Type -> Type
H2: Map G1
H3: Pure G1
H4: Mult G1
Applicative0: Applicative G1
H5: Map G2
H6: Pure G2
H7: Mult G2
Applicative1: Applicative G2
g: B -> G2 (T C)
f: A -> G1 (T B)

g ⋆6 f = runBatch f ∘ map (runBatch g) ∘ double_batch6
T: Type -> Type
H: Return T
H0: ToBatch6 T T
H1: TraversableMonad T
A, B, C: Type
G1, G2: Type -> Type
H2: Map G1
H3: Pure G1
H4: Mult G1
Applicative0: Applicative G1
H5: Map G2
H6: Pure G2
H7: Mult G2
Applicative1: Applicative G2
g: B -> G2 (T C)
f: A -> G1 (T B)

g ⋆6 f = runBatch f ∘ map (runBatch g) ∘ double_batch6
T: Type -> Type
H: Return T
H0: ToBatch6 T T
H1: TraversableMonad T
A, B, C: Type
G1, G2: Type -> Type
H2: Map G1
H3: Pure G1
H4: Mult G1
Applicative0: Applicative G1
H5: Map G2
H6: Pure G2
H7: Mult G2
Applicative1: Applicative G2
g: B -> G2 (T C)
f: A -> G1 (T B)
a: A

(g ⋆6 f) a = (runBatch f ∘ map (runBatch g) ∘ double_batch6) a
T: Type -> Type
H: Return T
H0: ToBatch6 T T
H1: TraversableMonad T
A, B, C: Type
G1, G2: Type -> Type
H2: Map G1
H3: Pure G1
H4: Mult G1
Applicative0: Applicative G1
H5: Map G2
H6: Pure G2
H7: Mult G2
Applicative1: Applicative G2
g: B -> G2 (T C)
f: A -> G1 (T B)
a: A

(g ⋆6 f) a = runBatch f (map (runBatch g) (double_batch6 a))
T: Type -> Type
H: Return T
H0: ToBatch6 T T
H1: TraversableMonad T
A, B, C: Type
G1, G2: Type -> Type
H2: Map G1
H3: Pure G1
H4: Mult G1
Applicative0: Applicative G1
H5: Map G2
H6: Pure G2
H7: Mult G2
Applicative1: Applicative G2
g: B -> G2 (T C)
f: A -> G1 (T B)
a: A

(g ⋆6 f) a = runBatch f (map (runBatch g) (Done toBatch6 ⧆ a))
T: Type -> Type
H: Return T
H0: ToBatch6 T T
H1: TraversableMonad T
A, B, C: Type
G1, G2: Type -> Type
H2: Map G1
H3: Pure G1
H4: Mult G1
Applicative0: Applicative G1
H5: Map G2
H6: Pure G2
H7: Mult G2
Applicative1: Applicative G2
g: B -> G2 (T C)
f: A -> G1 (T B)
a: A

(g ⋆6 f) a = runBatch f (map (compose (runBatch g)) (Done toBatch6) ⧆ a)
T: Type -> Type
H: Return T
H0: ToBatch6 T T
H1: TraversableMonad T
A, B, C: Type
G1, G2: Type -> Type
H2: Map G1
H3: Pure G1
H4: Mult G1
Applicative0: Applicative G1
H5: Map G2
H6: Pure G2
H7: Mult G2
Applicative1: Applicative G2
g: B -> G2 (T C)
f: A -> G1 (T B)
a: A

(g ⋆6 f) a = runBatch f (Done (runBatch g ∘ toBatch6) ⧆ a)
T: Type -> Type
H: Return T
H0: ToBatch6 T T
H1: TraversableMonad T
A, B, C: Type
G1, G2: Type -> Type
H2: Map G1
H3: Pure G1
H4: Mult G1
Applicative0: Applicative G1
H5: Map G2
H6: Pure G2
H7: Mult G2
Applicative1: Applicative G2
g: B -> G2 (T C)
f: A -> G1 (T B)
a: A

(g ⋆6 f) a = runBatch f (Done (runBatch g ∘ toBatch6)) <⋆> f a
T: Type -> Type
H: Return T
H0: ToBatch6 T T
H1: TraversableMonad T
A, B, C: Type
G1, G2: Type -> Type
H2: Map G1
H3: Pure G1
H4: Mult G1
Applicative0: Applicative G1
H5: Map G2
H6: Pure G2
H7: Mult G2
Applicative1: Applicative G2
g: B -> G2 (T C)
f: A -> G1 (T B)
a: A

(g ⋆6 f) a = pure (runBatch g ∘ toBatch6) <⋆> f a
T: Type -> Type
H: Return T
H0: ToBatch6 T T
H1: TraversableMonad T
A, B, C: Type
G1, G2: Type -> Type
H2: Map G1
H3: Pure G1
H4: Mult G1
Applicative0: Applicative G1
H5: Map G2
H6: Pure G2
H7: Mult G2
Applicative1: Applicative G2
g: B -> G2 (T C)
f: A -> G1 (T B)
a: A

(g ⋆6 f) a = map (runBatch g ∘ toBatch6) (f a)
reflexivity. Qed. (** ** Derived Laws *) (******************************************************************)
T: Type -> Type
H: Return T
H0: ToBatch6 T T
H1: TraversableMonad T

forall (G : Type -> Type) (Map_G : Map G) (Pure_G : Pure G) (Mult_G : Mult G), Applicative G -> forall (A B : Type) (f : A -> G (T B)), bindt f ∘ ret = f
T: Type -> Type
H: Return T
H0: ToBatch6 T T
H1: TraversableMonad T

forall (G : Type -> Type) (Map_G : Map G) (Pure_G : Pure G) (Mult_G : Mult G), Applicative G -> forall (A B : Type) (f : A -> G (T B)), bindt f ∘ ret = f
T: Type -> Type
H: Return T
H0: ToBatch6 T T
H1: TraversableMonad T
G: Type -> Type
Map_G: Map G
Pure_G: Pure G
Mult_G: Mult G
H2: Applicative G
A, B: Type
f: A -> G (T B)

bindt f ∘ ret = f
T: Type -> Type
H: Return T
H0: ToBatch6 T T
H1: TraversableMonad T
G: Type -> Type
Map_G: Map G
Pure_G: Pure G
Mult_G: Mult G
H2: Applicative G
A, B: Type
f: A -> G (T B)

runBatch f ∘ toBatch6 ∘ ret = f
T: Type -> Type
H: Return T
H0: ToBatch6 T T
H1: TraversableMonad T
G: Type -> Type
Map_G: Map G
Pure_G: Pure G
Mult_G: Mult G
H2: Applicative G
A, B: Type
f: A -> G (T B)

runBatch f ∘ (toBatch6 ∘ ret) = f
T: Type -> Type
H: Return T
H0: ToBatch6 T T
H1: TraversableMonad T
G: Type -> Type
Map_G: Map G
Pure_G: Pure G
Mult_G: Mult G
H2: Applicative G
A, B: Type
f: A -> G (T B)

runBatch f ∘ batch A (T B) = f
T: Type -> Type
H: Return T
H0: ToBatch6 T T
H1: TraversableMonad T
G: Type -> Type
Map_G: Map G
Pure_G: Pure G
Mult_G: Mult G
H2: Applicative G
A, B: Type
f: A -> G (T B)

f = f
reflexivity. Qed.
T: Type -> Type
H: Return T
H0: ToBatch6 T T
H1: TraversableMonad T

forall A : Type, bindt ret = id
T: Type -> Type
H: Return T
H0: ToBatch6 T T
H1: TraversableMonad T

forall A : Type, bindt ret = id
T: Type -> Type
H: Return T
H0: ToBatch6 T T
H1: TraversableMonad T
A: Type

bindt ret = id
T: Type -> Type
H: Return T
H0: ToBatch6 T T
H1: TraversableMonad T
A: Type

runBatch ret ∘ toBatch6 = id
T: Type -> Type
H: Return T
H0: ToBatch6 T T
H1: TraversableMonad T
A: Type

runBatch ret = extract_Batch ∘ mapfst_Batch ret
T: Type -> Type
H: Return T
H0: ToBatch6 T T
H1: TraversableMonad T
A: Type
cut: runBatch ret = extract_Batch ∘ mapfst_Batch ret
runBatch ret ∘ toBatch6 = id
T: Type -> Type
H: Return T
H0: ToBatch6 T T
H1: TraversableMonad T
A: Type

runBatch ret = extract_Batch ∘ mapfst_Batch ret
T: Type -> Type
H: Return T
H0: ToBatch6 T T
H1: TraversableMonad T
A: Type

runBatch ret = extract_Batch ○ mapfst_Batch ret
T: Type -> Type
H: Return T
H0: ToBatch6 T T
H1: TraversableMonad T
A: Type
b: Batch A (T A) (T A)

runBatch ret b = extract_Batch (mapfst_Batch ret b)
T: Type -> Type
H: Return T
H0: ToBatch6 T T
H1: TraversableMonad T
A, C: Type
c: C

runBatch ret (Done c) = extract_Batch (mapfst_Batch ret (Done c))
T: Type -> Type
H: Return T
H0: ToBatch6 T T
H1: TraversableMonad T
A, C: Type
b: Batch A (T A) (T A -> C)
a: A
IHb: runBatch ret b = extract_Batch (mapfst_Batch ret b)
runBatch ret (b ⧆ a) = extract_Batch (mapfst_Batch ret (b ⧆ a))
T: Type -> Type
H: Return T
H0: ToBatch6 T T
H1: TraversableMonad T
A, C: Type
c: C

runBatch ret (Done c) = extract_Batch (mapfst_Batch ret (Done c))
reflexivity.
T: Type -> Type
H: Return T
H0: ToBatch6 T T
H1: TraversableMonad T
A, C: Type
b: Batch A (T A) (T A -> C)
a: A
IHb: runBatch ret b = extract_Batch (mapfst_Batch ret b)

runBatch ret (b ⧆ a) = extract_Batch (mapfst_Batch ret (b ⧆ a))
T: Type -> Type
H: Return T
H0: ToBatch6 T T
H1: TraversableMonad T
A, C: Type
b: Batch A (T A) (T A -> C)
a: A
IHb: runBatch ret b = extract_Batch (mapfst_Batch ret b)

runBatch ret b (ret a) = extract_Batch (mapfst_Batch ret b) (ret a)
T: Type -> Type
H: Return T
H0: ToBatch6 T T
H1: TraversableMonad T
A, C: Type
b: Batch A (T A) (T A -> C)
a: A
IHb: runBatch ret b = extract_Batch (mapfst_Batch ret b)

extract_Batch (mapfst_Batch ret b) (ret a) = extract_Batch (mapfst_Batch ret b) (ret a)
reflexivity.
T: Type -> Type
H: Return T
H0: ToBatch6 T T
H1: TraversableMonad T
A: Type
cut: runBatch ret = extract_Batch ∘ mapfst_Batch ret

runBatch ret ∘ toBatch6 = id
T: Type -> Type
H: Return T
H0: ToBatch6 T T
H1: TraversableMonad T
A: Type
cut: runBatch ret = extract_Batch ∘ mapfst_Batch ret

extract_Batch ∘ mapfst_Batch ret ∘ toBatch6 = id
T: Type -> Type
H: Return T
H0: ToBatch6 T T
H1: TraversableMonad T
A: Type
cut: runBatch ret = extract_Batch ∘ mapfst_Batch ret

id = id
reflexivity. Qed.
T: Type -> Type
H: Return T
H0: ToBatch6 T T
H1: TraversableMonad T

forall (G1 : Type -> Type) (Map_G : Map G1) (Pure_G : Pure G1) (Mult_G : Mult G1), Applicative G1 -> forall (G2 : Type -> Type) (Map_G0 : Map G2) (Pure_G0 : Pure G2) (Mult_G0 : Mult G2), Applicative G2 -> forall (A B C : Type) (g : B -> G2 (T C)) (f : A -> G1 (T B)), map (bindt g) ∘ bindt f = bindt (g ⋆6 f)
T: Type -> Type
H: Return T
H0: ToBatch6 T T
H1: TraversableMonad T

forall (G1 : Type -> Type) (Map_G : Map G1) (Pure_G : Pure G1) (Mult_G : Mult G1), Applicative G1 -> forall (G2 : Type -> Type) (Map_G0 : Map G2) (Pure_G0 : Pure G2) (Mult_G0 : Mult G2), Applicative G2 -> forall (A B C : Type) (g : B -> G2 (T C)) (f : A -> G1 (T B)), map (bindt g) ∘ bindt f = bindt (g ⋆6 f)
T: Type -> Type
H: Return T
H0: ToBatch6 T T
H1: TraversableMonad T
G1: Type -> Type
Map_G: Map G1
Pure_G: Pure G1
Mult_G: Mult G1
H2: Applicative G1
G2: Type -> Type
Map_G0: Map G2
Pure_G0: Pure G2
Mult_G0: Mult G2
H3: Applicative G2
A, B, C: Type
g: B -> G2 (T C)
f: A -> G1 (T B)

map (bindt g) ∘ bindt f = bindt (g ⋆6 f)
T: Type -> Type
H: Return T
H0: ToBatch6 T T
H1: TraversableMonad T
G1: Type -> Type
Map_G: Map G1
Pure_G: Pure G1
Mult_G: Mult G1
H2: Applicative G1
G2: Type -> Type
Map_G0: Map G2
Pure_G0: Pure G2
Mult_G0: Mult G2
H3: Applicative G2
A, B, C: Type
g: B -> G2 (T C)
f: A -> G1 (T B)

map (runBatch g ∘ toBatch6) ∘ (runBatch f ∘ toBatch6) = runBatch (g ⋆6 f) ∘ toBatch6
T: Type -> Type
H: Return T
H0: ToBatch6 T T
H1: TraversableMonad T
G1: Type -> Type
Map_G: Map G1
Pure_G: Pure G1
Mult_G: Mult G1
H2: Applicative G1
G2: Type -> Type
Map_G0: Map G2
Pure_G0: Pure G2
Mult_G0: Mult G2
H3: Applicative G2
A, B, C: Type
g: B -> G2 (T C)
f: A -> G1 (T B)

map (runBatch g ∘ toBatch6) ∘ runBatch f ∘ toBatch6 = runBatch (g ⋆6 f) ∘ toBatch6
T: Type -> Type
H: Return T
H0: ToBatch6 T T
H1: TraversableMonad T
G1: Type -> Type
Map_G: Map G1
Pure_G: Pure G1
Mult_G: Mult G1
H2: Applicative G1
G2: Type -> Type
Map_G0: Map G2
Pure_G0: Pure G2
Mult_G0: Mult G2
H3: Applicative G2
A, B, C: Type
g: B -> G2 (T C)
f: A -> G1 (T B)

map (runBatch g) ∘ map toBatch6 ∘ runBatch f ∘ toBatch6 = runBatch (g ⋆6 f) ∘ toBatch6
T: Type -> Type
H: Return T
H0: ToBatch6 T T
H1: TraversableMonad T
G1: Type -> Type
Map_G: Map G1
Pure_G: Pure G1
Mult_G: Mult G1
H2: Applicative G1
G2: Type -> Type
Map_G0: Map G2
Pure_G0: Pure G2
Mult_G0: Mult G2
H3: Applicative G2
A, B, C: Type
g: B -> G2 (T C)
f: A -> G1 (T B)

map (runBatch g) ∘ (map toBatch6 ∘ runBatch f) ∘ toBatch6 = runBatch (g ⋆6 f) ∘ toBatch6
T: Type -> Type
H: Return T
H0: ToBatch6 T T
H1: TraversableMonad T
G1: Type -> Type
Map_G: Map G1
Pure_G: Pure G1
Mult_G: Mult G1
H2: Applicative G1
G2: Type -> Type
Map_G0: Map G2
Pure_G0: Pure G2
Mult_G0: Mult G2
H3: Applicative G2
A, B, C: Type
g: B -> G2 (T C)
f: A -> G1 (T B)

map (runBatch g) ∘ (runBatch f ∘ map toBatch6) ∘ toBatch6 = runBatch (g ⋆6 f) ∘ toBatch6
T: Type -> Type
H: Return T
H0: ToBatch6 T T
H1: TraversableMonad T
G1: Type -> Type
Map_G: Map G1
Pure_G: Pure G1
Mult_G: Mult G1
H2: Applicative G1
G2: Type -> Type
Map_G0: Map G2
Pure_G0: Pure G2
Mult_G0: Mult G2
H3: Applicative G2
A, B, C: Type
g: B -> G2 (T C)
f: A -> G1 (T B)

map (runBatch g) ∘ runBatch f ∘ map toBatch6 ∘ toBatch6 = runBatch (g ⋆6 f) ∘ toBatch6
T: Type -> Type
H: Return T
H0: ToBatch6 T T
H1: TraversableMonad T
G1: Type -> Type
Map_G: Map G1
Pure_G: Pure G1
Mult_G: Mult G1
H2: Applicative G1
G2: Type -> Type
Map_G0: Map G2
Pure_G0: Pure G2
Mult_G0: Mult G2
H3: Applicative G2
A, B, C: Type
g: B -> G2 (T C)
f: A -> G1 (T B)

map (runBatch g) ∘ runBatch f ∘ (map toBatch6 ∘ toBatch6) = runBatch (g ⋆6 f) ∘ toBatch6
T: Type -> Type
H: Return T
H0: ToBatch6 T T
H1: TraversableMonad T
G1: Type -> Type
Map_G: Map G1
Pure_G: Pure G1
Mult_G: Mult G1
H2: Applicative G1
G2: Type -> Type
Map_G0: Map G2
Pure_G0: Pure G2
Mult_G0: Mult G2
H3: Applicative G2
A, B, C: Type
g: B -> G2 (T C)
f: A -> G1 (T B)

map (runBatch g) ∘ runBatch f ∘ (cojoin_Batch6 A B C ∘ toBatch6) = runBatch (g ⋆6 f) ∘ toBatch6
T: Type -> Type
H: Return T
H0: ToBatch6 T T
H1: TraversableMonad T
G1: Type -> Type
Map_G: Map G1
Pure_G: Pure G1
Mult_G: Mult G1
H2: Applicative G1
G2: Type -> Type
Map_G0: Map G2
Pure_G0: Pure G2
Mult_G0: Mult G2
H3: Applicative G2
A, B, C: Type
g: B -> G2 (T C)
f: A -> G1 (T B)

map (runBatch g) ∘ runBatch f ∘ (runBatch double_batch6 ∘ toBatch6) = runBatch (g ⋆6 f) ∘ toBatch6
T: Type -> Type
H: Return T
H0: ToBatch6 T T
H1: TraversableMonad T
G1: Type -> Type
Map_G: Map G1
Pure_G: Pure G1
Mult_G: Mult G1
H2: Applicative G1
G2: Type -> Type
Map_G0: Map G2
Pure_G0: Pure G2
Mult_G0: Mult G2
H3: Applicative G2
A, B, C: Type
g: B -> G2 (T C)
f: A -> G1 (T B)

map (runBatch g) ∘ runBatch f ∘ runBatch double_batch6 ∘ toBatch6 = runBatch (g ⋆6 f) ∘ toBatch6
T: Type -> Type
H: Return T
H0: ToBatch6 T T
H1: TraversableMonad T
G1: Type -> Type
Map_G: Map G1
Pure_G: Pure G1
Mult_G: Mult G1
H2: Applicative G1
G2: Type -> Type
Map_G0: Map G2
Pure_G0: Pure G2
Mult_G0: Mult G2
H3: Applicative G2
A, B, C: Type
g: B -> G2 (T C)
f: A -> G1 (T B)

runBatch f ∘ map (runBatch g) ∘ runBatch double_batch6 ∘ toBatch6 = runBatch (g ⋆6 f) ∘ toBatch6
T: Type -> Type
H: Return T
H0: ToBatch6 T T
H1: TraversableMonad T
G1: Type -> Type
Map_G: Map G1
Pure_G: Pure G1
Mult_G: Mult G1
H2: Applicative G1
G2: Type -> Type
Map_G0: Map G2
Pure_G0: Pure G2
Mult_G0: Mult G2
H3: Applicative G2
A, B, C: Type
g: B -> G2 (T C)
f: A -> G1 (T B)

runBatch (runBatch f ∘ map (runBatch g) ∘ double_batch6) ∘ toBatch6 = runBatch (g ⋆6 f) ∘ toBatch6
T: Type -> Type
H: Return T
H0: ToBatch6 T T
H1: TraversableMonad T
G1: Type -> Type
Map_G: Map G1
Pure_G: Pure G1
Mult_G: Mult G1
H2: Applicative G1
G2: Type -> Type
Map_G0: Map G2
Pure_G0: Pure G2
Mult_G0: Mult G2
H3: Applicative G2
A, B, C: Type
g: B -> G2 (T C)
f: A -> G1 (T B)

runBatch (runBatch f ∘ map (runBatch g) ∘ double_batch6) ∘ toBatch6 = runBatch (runBatch f ∘ map (runBatch g) ∘ double_batch6) ∘ toBatch6
reflexivity. Qed.
T: Type -> Type
H: Return T
H0: ToBatch6 T T
H1: TraversableMonad T

forall (G1 G2 : Type -> Type) (H2 : Map G1) (H3 : Mult G1) (H4 : Pure G1) (H5 : Map G2) (H6 : Mult G2) (H7 : Pure G2) (ϕ : forall A : Type, G1 A -> G2 A), ApplicativeMorphism G1 G2 ϕ -> forall (A B : Type) (f : A -> G1 (T B)), ϕ (T B) ∘ bindt f = bindt (ϕ (T B) ∘ f)
T: Type -> Type
H: Return T
H0: ToBatch6 T T
H1: TraversableMonad T

forall (G1 G2 : Type -> Type) (H2 : Map G1) (H3 : Mult G1) (H4 : Pure G1) (H5 : Map G2) (H6 : Mult G2) (H7 : Pure G2) (ϕ : forall A : Type, G1 A -> G2 A), ApplicativeMorphism G1 G2 ϕ -> forall (A B : Type) (f : A -> G1 (T B)), ϕ (T B) ∘ bindt f = bindt (ϕ (T B) ∘ f)
T: Type -> Type
H: Return T
H0: ToBatch6 T T
H1: TraversableMonad T
G1, G2: Type -> Type
H2: Map G1
H3: Mult G1
H4: Pure G1
H5: Map G2
H6: Mult G2
H7: Pure G2
ϕ: forall A : Type, G1 A -> G2 A
H8: ApplicativeMorphism G1 G2 ϕ
A, B: Type
f: A -> G1 (T B)

ϕ (T B) ∘ bindt f = bindt (ϕ (T B) ∘ f)
T: Type -> Type
H: Return T
H0: ToBatch6 T T
H1: TraversableMonad T
G1, G2: Type -> Type
H2: Map G1
H3: Mult G1
H4: Pure G1
H5: Map G2
H6: Mult G2
H7: Pure G2
ϕ: forall A : Type, G1 A -> G2 A
H8: ApplicativeMorphism G1 G2 ϕ
A, B: Type
f: A -> G1 (T B)

ϕ (T B) ∘ (runBatch f ∘ toBatch6) = runBatch (ϕ (T B) ∘ f) ∘ toBatch6
T: Type -> Type
H: Return T
H0: ToBatch6 T T
H1: TraversableMonad T
G1, G2: Type -> Type
H2: Map G1
H3: Mult G1
H4: Pure G1
H5: Map G2
H6: Mult G2
H7: Pure G2
ϕ: forall A : Type, G1 A -> G2 A
H8: ApplicativeMorphism G1 G2 ϕ
A, B: Type
f: A -> G1 (T B)

ϕ (T B) ∘ runBatch f ∘ toBatch6 = runBatch (ϕ (T B) ∘ f) ∘ toBatch6
now rewrite runBatch_morphism'. Qed. (** ** Typeclass Instances *) (******************************************************************) #[export] Instance: Kleisli.TraversableMonad.TraversableRightPreModule T T := {| ktm_bindt1 := ktm_bindt1_T; ktm_bindt2 := @ktm_bindt2_T; ktm_morph := @ktm_morph_T; |}. #[export] Instance TraversableMonad_Kleisli_Coalgebraic: Kleisli.TraversableMonad.TraversableMonad T := {| ktm_bindt0 := @ktm_bindt0_T; |}. End with_algebra. End DerivedInstances.