Definition Mbind {A B:Type} (m:monad A) f :=
  (λ st, let (st',x) := Meval m st in
         let m' := f x in Meval m' st'):monad B.Infix ">>=" := Mbind (at level 15, left associativity) : monad_scope.

(* Specifications: *)
Lemma le_lt_Mbind_lt {A B:Type} (ma:monad A) (f:A → monad B): Mle ma → (∀ a, Mlt (f a)) → Mlt (ma >>= f).
Lemma lt_le_Mbind_lt {A B:Type} (ma:monad A) (f:A → monad B): Mlt ma → (∀ a, Mle (f a)) → Mlt (ma >>= f).
Lemma eq_eq_Mbind_eq {A B:Type} (ma:monad A) (f:A → monad B): Meq ma → (∀ a, Meq (f a)) → Meq (ma >>= f).
Lemma lt_lt_Mbind_lt {A B:Type} (ma:monad A) (f:A → monad B): Mlt ma → (∀ a, Mlt (f a)) → Mlt (ma >>= f).
Lemma mono_mono_Mbind_mono {A B:Type} (ma:monad A) (f:A → monad B): Mmono ma → Mmono_one f → Mmono (ma >>= f).
Lemma Mbind_ind {A:Type} (ma:monad A) (f:A→monad A) (P:A → Prop): (∀ st, P (snd (ma st))) → (∀ (a:A), P a → ∀ st, P (snd ((f a) st))) → ∀ st, P (snd ((ma>>=f) st)).