Definition Mbind2 {A B C:Type} (mab:monad (A*B)) (f:A→B→monad C) :=
(λ st, let (st',ab):= Meval mab st in let m':=f (fst ab) (snd ab) in m' st'):monad C.
Infix ">>==" := Mbind2 (at level 15, left associativity) : monad_scope.

(* Adhoc lemmas for the very specific uses of Mbind2 we have…*)
Lemma Mbind2_triple {A B:Type} (ma1 ma2 ma3:monad A) (mb:monad B) (f:(A*A*A)→B→monad A) (P:A→Prop):
(∀ st, P (snd (ma1 st))) →
(∀ st, P (snd (ma2 st))) →
(∀ st, P (snd (ma3 st))) →
(∀ xyz, P (fst (fst xyz)) → P (snd (fst xyz)) → P (snd xyz) →
(∀ b st, P (snd ((f xyz b) st)))) →
∀ st, P (snd ((ma1 >>+ ma2 >>++ ma3 >>+ mb >>== f) st)).