Documentation

ToMathlib.Control.WriterT

Laws for well behaved monadic failure operation #

class LawfulAppend (α : Type u) [EmptyCollection α] [Append α] :

Typeclass for instances where is an identity for ++.

  • empty_append (x : α) : ++ x = x
  • append_empty (x : α) : x ++ = x
  • append_assoc (x y z : α) : x ++ (y ++ z) = x ++ y ++ z
Instances
    @[simp]
    theorem WriterT.run_mk {m : Type u → Type v} [Monad m] {α ω : Type u} [LawfulMonad m] (x : m (α × ω)) :
    @[simp]
    theorem WriterT.run_tell {m : Type u → Type v} [Monad m] {ω : Type u} (w : ω) :
    @[simp]
    theorem WriterT.run_monadLift {m : Type u → Type v} [Monad m] {ω α : Type u} [Monoid ω] (x : m α) :
    (monadLift x).run = (fun (x : α) => (x, 1)) <$> x
    theorem WriterT.liftM_def {m : Type u → Type v} [Monad m] {ω α : Type u} [Monoid ω] (x : m α) :
    liftM x = WriterT.mk ((fun (x : α) => (x, 1)) <$> x)
    theorem WriterT.monadLift_def {m : Type u → Type v} [Monad m] {ω α : Type u} [Monoid ω] (x : m α) :
    MonadLift.monadLift x = WriterT.mk ((fun (x : α) => (x, 1)) <$> x)
    theorem WriterT.bind_def {m : Type u → Type v} [Monad m] {ω α β : Type u} [Monoid ω] (x : WriterT ω m α) (f : αWriterT ω m β) :
    x >>= f = WriterT.mk do let xx.run match x with | (a, w₁) => (Prod.map id fun (x : ω) => w₁ * x) <$> f a
    @[simp]
    theorem WriterT.run_pure {m : Type u → Type v} [Monad m] {ω α : Type u} [Monoid ω] [LawfulMonad m] (x : α) :
    (pure x).run = pure (x, 1)
    @[simp]
    theorem WriterT.run_bind {m : Type u → Type v} [Monad m] {ω α β : Type u} [Monoid ω] [LawfulMonad m] (x : WriterT ω m α) (f : αWriterT ω m β) :
    (x >>= f).run = do let xx.run match x with | (a, w₁) => (Prod.map id fun (x : ω) => w₁ * x) <$> (f a).run
    @[simp]
    theorem WriterT.run_seqLeft {m : Type u → Type v} [Monad m] {ω : Type u} [Monoid ω] {α β : Type u} (x : WriterT ω m α) (y : WriterT ω m β) :
    (x *> y).run = do let zx.run (Prod.map id fun (x : ω) => z.snd * x) <$> y.run
    @[simp]
    theorem WriterT.run_map {m : Type u → Type v} [Monad m] {ω α β : Type u} [Monoid ω] (x : WriterT ω m α) (f : αβ) :
    (f <$> x).run = Prod.map f id <$> x.run
    @[simp]
    theorem WriterT.run_monadLift' {m : Type u → Type v} [Monad m] {ω α : Type u} [EmptyCollection ω] (x : m α) :
    (monadLift x).run = (fun (x : α) => (x, )) <$> x
    theorem WriterT.liftM_def' {m : Type u → Type v} [Monad m] {ω α : Type u} [EmptyCollection ω] (x : m α) :
    liftM x = WriterT.mk ((fun (x : α) => (x, )) <$> x)
    theorem WriterT.monadLift_def' {m : Type u → Type v} [Monad m] {ω α : Type u} [EmptyCollection ω] (x : m α) :
    MonadLift.monadLift x = WriterT.mk ((fun (x : α) => (x, )) <$> x)
    theorem WriterT.bind_def' {m : Type u → Type v} [Monad m] {ω α β : Type u} [EmptyCollection ω] [Append ω] (x : WriterT ω m α) (f : αWriterT ω m β) :
    x >>= f = WriterT.mk do let xx.run match x with | (a, w₁) => (Prod.map id fun (x : ω) => w₁ ++ x) <$> f a
    @[simp]
    theorem WriterT.run_pure' {m : Type u → Type v} [Monad m] {ω α : Type u} [EmptyCollection ω] [Append ω] [LawfulMonad m] (x : α) :
    @[simp]
    theorem WriterT.run_bind' {m : Type u → Type v} [Monad m] {ω α β : Type u} [EmptyCollection ω] [Append ω] [LawfulMonad m] (x : WriterT ω m α) (f : αWriterT ω m β) :
    (x >>= f).run = do let xx.run match x with | (a, w₁) => (Prod.map id fun (x : ω) => w₁ ++ x) <$> (f a).run
    @[simp]
    theorem WriterT.run_seqLeft' {m : Type u → Type v} [Monad m] {ω : Type u} [Monoid ω] {α β : Type u} (x : WriterT ω m α) (y : WriterT ω m β) :
    (x *> y).run = do let zx.run (Prod.map id fun (x : ω) => z.snd * x) <$> y.run
    @[simp]
    theorem WriterT.run_map' {m : Type u → Type v} [Monad m] {ω α β : Type u} [EmptyCollection ω] [Append ω] (x : WriterT ω m α) (f : αβ) :
    (f <$> x).run = Prod.map f id <$> x.run
    @[inline]
    def WriterT.orElse {m : Type u → Type v} [AlternativeMonad m] {ω α : Type u} (x₁ : WriterT ω m α) (x₂ : UnitWriterT ω m α) :
    WriterT ω m α
    Equations
      Instances For
        @[inline]
        def WriterT.failure {m : Type u → Type v} [AlternativeMonad m] {ω α : Type u} :
        WriterT ω m α
        Equations
          Instances For
            @[simp]
            theorem WriterT.run_failure {m : Type u → Type v} [AlternativeMonad m] {ω : Type u} [Monoid ω] {α : Type u} :