Lemmas about Array.forIn' and Array.forIn. #
Monadic operations #
mapM #
foldlM and foldrM #
theorem
Array.foldlM_filterMap
{m : Type u_1 → Type u_2}
{α : Type u_3}
{β : Type u_4}
{γ : Type u_1}
[Monad m]
[LawfulMonad m]
(f : α → Option β)
(g : γ → β → m γ)
(l : Array α)
(init : γ)
 :
theorem
Array.foldrM_filterMap
{m : Type u_1 → Type u_2}
{α : Type u_3}
{β : Type u_4}
{γ : Type u_1}
[Monad m]
[LawfulMonad m]
(f : α → Option β)
(g : β → γ → m γ)
(l : Array α)
(init : γ)
 :
forM #
forIn' #
theorem
Array.forIn'_congr
{m : Type u_1 → Type u_2}
{α : Type u_3}
{β : Type u_1}
[Monad m]
{as bs : Array α}
(w : as = bs)
{b b' : β}
(hb : b = b')
{f : (a' : α) → a' ∈ as → β → m (ForInStep β)}
{g : (a' : α) → a' ∈ bs → β → m (ForInStep β)}
(h : ∀ (a : α) (m_1 : a ∈ bs) (b : β), f a ⋯ b = g a m_1 b)
 :
theorem
Array.forIn'_eq_foldlM
{m : Type u_1 → Type u_2}
{α : Type u_3}
{β : Type u_1}
[Monad m]
[LawfulMonad m]
(l : Array α)
(f : (a : α) → a ∈ l → β → m (ForInStep β))
(init : β)
 :
forIn' l init f =   ForInStep.value <$>     foldlM
      (fun (b : ForInStep β) (x : { x : α // x ∈ l }) =>
        match x with
        | ⟨a, m_1⟩ =>
          match b with
          | ForInStep.yield b => f a m_1 b
          | ForInStep.done b => pure (ForInStep.done b))
      (ForInStep.yield init) l.attach
We can express a for loop over an array as a fold,
in which whenever we reach .done b we keep that value through the rest of the fold.
@[simp]
theorem
Array.forIn'_yield_eq_foldlM
{m : Type u_1 → Type u_2}
{α : Type u_3}
{β γ : Type u_1}
[Monad m]
[LawfulMonad m]
(l : Array α)
(f : (a : α) → a ∈ l → β → m γ)
(g : (a : α) → a ∈ l → β → γ → β)
(init : β)
 :
We can express a for loop over an array which always yields as a fold.
theorem
Array.forIn'_pure_yield_eq_foldl
{m : Type u_1 → Type u_2}
{α : Type u_3}
{β : Type u_1}
[Monad m]
[LawfulMonad m]
(l : Array α)
(f : (a : α) → a ∈ l → β → β)
(init : β)
 :
@[simp]
@[simp]
theorem
Array.forIn_eq_foldlM
{m : Type u_1 → Type u_2}
{α : Type u_3}
{β : Type u_1}
[Monad m]
[LawfulMonad m]
(f : α → β → m (ForInStep β))
(init : β)
(l : Array α)
 :
forIn l init f =   ForInStep.value <$>     foldlM
      (fun (b : ForInStep β) (a : α) =>
        match b with
        | ForInStep.yield b => f a b
        | ForInStep.done b => pure (ForInStep.done b))
      (ForInStep.yield init) l
We can express a for loop over an array as a fold,
in which whenever we reach .done b we keep that value through the rest of the fold.
@[simp]
theorem
Array.forIn_yield_eq_foldlM
{m : Type u_1 → Type u_2}
{α : Type u_3}
{β γ : Type u_1}
[Monad m]
[LawfulMonad m]
(l : Array α)
(f : α → β → m γ)
(g : α → β → γ → β)
(init : β)
 :
We can express a for loop over an array which always yields as a fold.
theorem
Array.forIn_pure_yield_eq_foldl
{m : Type u_1 → Type u_2}
{α : Type u_3}
{β : Type u_1}
[Monad m]
[LawfulMonad m]
(l : Array α)
(f : α → β → β)
(init : β)
 :
@[simp]
theorem
Array.forIn_yield_eq_foldl
{α : Type u_1}
{β : Type u_2}
(l : Array α)
(f : α → β → β)
(init : β)
 :
(forIn l init fun (a : α) (b : β) => ForInStep.yield (f a b)) = foldl (fun (b : β) (a : α) => f a b) init l