module Chapter3.IDesc.FreeMonad.IMonad where open import Function open import Chapter1.Logic record RawIMonad {I : Set} (M : Pow I → Pow I) : Set₁ where infixl 1 _>>=_ infixr 1 _=<<_ field return : ∀ {A} → A ⇒ M A _>>=_ : ∀ {A B i} → M A i → (A ⇒ M B) → M B i _=<<_ : ∀ {i A B} → (A ⇒ M B) → M A i → M B i f =<< c = c >>= f join : ∀ {i A} → M (M A) i → M A i join m = m >>= id