mathlib3 documentation

core / init.control.lawful

@[class]
structure is_lawful_applicative (f : Type u Type v) [applicative f] :
Prop
Instances of this typeclass
@[simp]
theorem pure_id_seq {α : Type u} {f : Type u Type v} [applicative f] [is_lawful_applicative f] (x : f α) :
@[class]
structure is_lawful_monad (m : Type u Type v) [monad m] :
Prop
Instances of this typeclass
@[simp]
theorem bind_pure {α : Type u} {m : Type u Type v} [monad m] [is_lawful_monad m] (x : m α) :
theorem bind_ext_congr {α β : Type u} {m : Type u Type v} [has_bind m] {x : m α} {f g : α m β} :
( (a : α), f a = g a) x >>= f = x >>= g
theorem map_ext_congr {α β : Type u} {m : Type u Type v} [functor m] {x : m α} {f g : α β} :
( (a : α), f a = g a) f <$> x = g <$> x
@[simp]
theorem id.map_eq {α β : Type} (x : id α) (f : α β) :
f <$> x = f x
@[simp]
theorem id.bind_eq {α β : Type} (x : id α) (f : α id β) :
x >>= f = f x
@[simp]
theorem id.pure_eq {α : Type} (a : α) :
@[protected, instance]
@[ext]
theorem state_t.ext {σ : Type u} {m : Type u Type v} {α : Type u} {x x' : state_t σ m α} (h : (st : σ), x.run st = x'.run st) :
x = x'
@[simp]
theorem state_t.run_pure {σ : Type u} {m : Type u Type v} {α : Type u} (st : σ) [monad m] (a : α) :
@[simp]
theorem state_t.run_bind {σ : Type u} {m : Type u Type v} {α β : Type u} (x : state_t σ m α) (st : σ) [monad m] (f : α state_t σ m β) :
(x >>= f).run st = x.run st >>= λ (p : α × σ), (f p.fst).run p.snd
@[simp]
theorem state_t.run_map {σ : Type u} {m : Type u Type v} {α β : Type u} (x : state_t σ m α) (st : σ) [monad m] (f : α β) [is_lawful_monad m] :
(f <$> x).run st = (λ (p : α × σ), (f p.fst, p.snd)) <$> x.run st
@[simp]
theorem state_t.run_monad_lift {σ : Type u} {m : Type u Type v} {α : Type u} (st : σ) [monad m] {n : Type u Type u_1} [has_monad_lift_t n m] (x : n α) :
@[simp]
theorem state_t.run_monad_map {σ : Type u} {m : Type u Type v} {α : Type u} (x : state_t σ m α) (st : σ) [monad m] {m' : Type u Type v} {n n' : Type u Type u_1} [monad m'] [monad_functor_t n n' m m'] (f : Π {α : Type u}, n α n' α) :
@[simp]
theorem state_t.run_adapt {σ : Type u} {m : Type u Type v} {α : Type u} [monad m] {σ' σ'' : Type u} (st : σ) (split : σ σ' × σ'') (join : σ' σ'' σ) (x : state_t σ' m α) :
(state_t.adapt split join x).run st = (λ (_a : σ' × σ''), _a.cases_on (λ (fst : σ') (snd : σ''), id_rhs (m × σ)) (x.run fst >>= λ (_p : α × σ'), (λ (_a : α × σ'), _a.cases_on (λ (fst : α) (snd_1 : σ'), id_rhs (m × σ)) (has_pure.pure (fst, join snd_1 snd)))) _p))) (split st)
@[simp]
theorem state_t.run_get {σ : Type u} {m : Type u Type v} (st : σ) [monad m] :
@[simp]
theorem state_t.run_put {σ : Type u} {m : Type u Type v} (st : σ) [monad m] (st' : σ) :
(state_t.put st').run st = has_pure.pure (punit.star, st')
@[protected, instance]
@[ext]
theorem except_t.ext {α ε : Type u} {m : Type u Type v} {x x' : except_t ε m α} (h : x.run = x'.run) :
x = x'
@[simp]
theorem except_t.run_pure {α ε : Type u} {m : Type u Type v} [monad m] (a : α) :
@[simp]
theorem except_t.run_bind {α β ε : Type u} {m : Type u Type v} (x : except_t ε m α) [monad m] (f : α except_t ε m β) :
@[simp]
theorem except_t.run_map {α β ε : Type u} {m : Type u Type v} (x : except_t ε m α) [monad m] (f : α β) [is_lawful_monad m] :
@[simp]
@[simp]
theorem except_t.run_monad_map {α ε : Type u} {m : Type u Type v} (x : except_t ε m α) [monad m] {m' : Type u Type v} {n n' : Type u Type u_1} [monad m'] [monad_functor_t n n' m m'] (f : Π {α : Type u}, n α n' α) :
@[protected, instance]
@[ext]
theorem reader_t.ext {ρ : Type u} {m : Type u Type v} {α : Type u} {x x' : reader_t ρ m α} (h : (r : ρ), x.run r = x'.run r) :
x = x'
@[simp]
theorem reader_t.run_pure {ρ : Type u} {m : Type u Type v} {α : Type u} (r : ρ) [monad m] (a : α) :
@[simp]
theorem reader_t.run_bind {ρ : Type u} {m : Type u Type v} {α β : Type u} (x : reader_t ρ m α) (r : ρ) [monad m] (f : α reader_t ρ m β) :
(x >>= f).run r = x.run r >>= λ (a : α), (f a).run r
@[simp]
theorem reader_t.run_map {ρ : Type u} {m : Type u Type v} {α β : Type u} (x : reader_t ρ m α) (r : ρ) [monad m] (f : α β) [is_lawful_monad m] :
(f <$> x).run r = f <$> x.run r
@[simp]
theorem reader_t.run_monad_lift {ρ : Type u} {m : Type u Type v} {α : Type u} (r : ρ) [monad m] {n : Type u Type u_1} [has_monad_lift_t n m] (x : n α) :
@[simp]
theorem reader_t.run_monad_map {ρ : Type u} {m : Type u Type v} {α : Type u} (x : reader_t ρ m α) (r : ρ) [monad m] {m' : Type u Type v} {n n' : Type u Type u_1} [monad m'] [monad_functor_t n n' m m'] (f : Π {α : Type u}, n α n' α) :
@[simp]
theorem reader_t.run_read {ρ : Type u} {m : Type u Type v} (r : ρ) [monad m] :
@[protected, instance]
@[ext]
theorem option_t.ext {α : Type u} {m : Type u Type v} {x x' : option_t m α} (h : x.run = x'.run) :
x = x'
@[simp]
theorem option_t.run_pure {α : Type u} {m : Type u Type v} [monad m] (a : α) :
@[simp]
theorem option_t.run_bind {α β : Type u} {m : Type u Type v} (x : option_t m α) [monad m] (f : α option_t m β) :
@[simp]
theorem option_t.run_map {α β : Type u} {m : Type u Type v} (x : option_t m α) [monad m] (f : α β) [is_lawful_monad m] :
@[simp]
theorem option_t.run_monad_map {α : Type u} {m : Type u Type v} (x : option_t m α) [monad m] {m' : Type u Type v} {n n' : Type u Type u_1} [monad m'] [monad_functor_t n n' m m'] (f : Π {α : Type u}, n α n' α) :
@[protected, instance]