LawfulMonadLift and LawfulMonadLiftT #
This module provides classes asserting that MonadLift and MonadLiftT are lawful, which means
that monadLift is compatible with pure and bind.
class LawfulMonadLift (m : semiOutParam (Type u → Type v)) (n : Type u → Type w) [Monad m] [Monad n] [inst : MonadLift m n] :
The MonadLift typeclass only contains the lifting operation. LawfulMonadLift further
asserts that lifting commutes with pure and bind:
monadLift (pure a) = pure a
monadLift (ma >>= f) = monadLift ma >>= monadLift ∘ f
Lifting preserves
pure- monadLift_bind {α β : Type u} (ma : m α) (f : α → m β) : MonadLift.monadLift (ma >>= f) = do let x ← MonadLift.monadLift ma MonadLift.monadLift (f x)
Lifting preserves
bind
Instances
class LawfulMonadLiftT (m : Type u → Type v) (n : Type u → Type w) [Monad m] [Monad n] [inst : MonadLiftT m n] :
The MonadLiftT typeclass only contains the transitive lifting operation.
LawfulMonadLiftT further asserts that lifting commutes with pure and bind:
monadLift (pure a) = pure a
monadLift (ma >>= f) = monadLift ma >>= monadLift ∘ f
Lifting preserves
pure- monadLift_bind {α β : Type u} (ma : m α) (f : α → m β) : monadLift (ma >>= f) = do let x ← monadLift ma monadLift (f x)
Lifting preserves
bind