Documentation

Init.Data.Fin.Fold

@[inline]
def Fin.foldl {α : Sort u_1} (n : Nat) (f : αFin nα) (init : α) :
α

Combine all the values that can be represented by Fin n with an initial value, starting at 0 and nesting to the left.

Example:

  • Fin.foldl 3 (· + ·.val) (0 : Nat) = ((0 + (0 : Fin 3).val) + (1 : Fin 3).val) + (2 : Fin 3).val
Equations
Instances For
    @[inline]
    def Fin.foldr {α : Sort u_1} (n : Nat) (f : Fin nαα) (init : α) :
    α

    Combine all the values that can be represented by Fin n with an initial value, starting at n - 1 and nesting to the right.

    Example:

    • Fin.foldr 3 (·.val + ·) (0 : Nat) = (0 : Fin 3).val + ((1 : Fin 3).val + ((2 : Fin 3).val + 0))
    Equations
    Instances For
      @[inline]
      def Fin.foldlM {m : Type u_1 → Type u_2} {α : Type u_1} [Monad m] (n : Nat) (f : αFin nm α) (init : α) :
      m α

      Folds a monadic function over all the values in Fin n from left to right, starting with 0.

      It is the sequence of steps:

      Fin.foldlM n f x₀ = do
        let x₁ ← f x₀ 0
        let x₂ ← f x₁ 1
        ...
        let xₙ ← f xₙ₋₁ (n-1)
        pure xₙ
      
      Equations
      Instances For
        @[inline]
        def Fin.foldrM {m : Type u_1 → Type u_2} {α : Type u_1} [Monad m] (n : Nat) (f : Fin nαm α) (init : α) :
        m α

        Folds a monadic function over Fin n from right to left, starting with n-1.

        It is the sequence of steps:

        Fin.foldrM n f xₙ = do
          let xₙ₋₁ ← f (n-1) xₙ
          let xₙ₋₂ ← f (n-2) xₙ₋₁
          ...
          let x₀ ← f 0 x₁
          pure x₀
        
        Equations
        Instances For

          foldlM #

          theorem Fin.foldlM_congr {m : Type u_1 → Type u_2} {α : Type u_1} [Monad m] {n k : Nat} (w : n = k) (f : αFin nm α) :
          foldlM n f = foldlM k fun (x : α) (i : Fin k) => f x (Fin.cast i)
          @[simp]
          theorem Fin.foldlM_zero {m : Type u_1 → Type u_2} {α : Type u_1} [Monad m] (f : αFin 0m α) :
          theorem Fin.foldlM_succ {m : Type u_1 → Type u_2} {α : Type u_1} {n : Nat} [Monad m] (f : αFin (n + 1)m α) :
          foldlM (n + 1) f = fun (x : α) => f x 0 >>= foldlM n fun (x : α) (j : Fin n) => f x j.succ
          theorem Fin.foldlM_succ_last {m : Type u_1 → Type u_2} {α : Type u_1} {n : Nat} [Monad m] [LawfulMonad m] (f : αFin (n + 1)m α) :
          foldlM (n + 1) f = fun (x : α) => do let xfoldlM n (fun (x : α) (j : Fin n) => f x j.castSucc) x f x (last n)

          Variant of foldlM_succ that splits off Fin.last n rather than 0.

          theorem Fin.foldlM_add {m : Type u_1 → Type u_2} {α : Type u_1} {n k : Nat} [Monad m] [LawfulMonad m] (f : αFin (n + k)m α) :
          foldlM (n + k) f = fun (x : α) => foldlM n (fun (x : α) (i : Fin n) => f x (castLE i)) x >>= foldlM k fun (x : α) (i : Fin k) => f x (natAdd n i)

          foldrM #

          theorem Fin.foldrM_congr {m : Type u_1 → Type u_2} {α : Type u_1} [Monad m] {n k : Nat} (w : n = k) (f : Fin nαm α) :
          foldrM n f = foldrM k fun (i : Fin k) => f (Fin.cast i)
          @[simp]
          theorem Fin.foldrM_zero {m : Type u_1 → Type u_2} {α : Type u_1} [Monad m] (f : Fin 0αm α) :
          theorem Fin.foldrM_succ {m : Type u_1 → Type u_2} {n : Nat} {α : Type u_1} [Monad m] [LawfulMonad m] (f : Fin (n + 1)αm α) :
          foldrM (n + 1) f = fun (x : α) => foldrM n (fun (i : Fin n) => f i.succ) x >>= f 0
          theorem Fin.foldrM_succ_last {m : Type u_1 → Type u_2} {n : Nat} {α : Type u_1} [Monad m] [LawfulMonad m] (f : Fin (n + 1)αm α) :
          foldrM (n + 1) f = fun (x : α) => f (last n) x >>= foldrM n fun (i : Fin n) => f i.castSucc
          theorem Fin.foldrM_add {m : Type u_1 → Type u_2} {n k : Nat} {α : Type u_1} [Monad m] [LawfulMonad m] (f : Fin (n + k)αm α) :
          foldrM (n + k) f = fun (x : α) => foldrM k (fun (i : Fin k) => f (natAdd n i)) x >>= foldrM n fun (i : Fin n) => f (castLE i)

          foldl #

          theorem Fin.foldl_congr {α : Sort u_1} {n k : Nat} (w : n = k) (f : αFin nα) :
          foldl n f = foldl k fun (x : α) (i : Fin k) => f x (Fin.cast i)
          @[simp]
          theorem Fin.foldl_zero {α : Sort u_1} (f : αFin 0α) (x : α) :
          foldl 0 f x = x
          theorem Fin.foldl_succ {α : Sort u_1} {n : Nat} (f : αFin (n + 1)α) (x : α) :
          foldl (n + 1) f x = foldl n (fun (x : α) (i : Fin n) => f x i.succ) (f x 0)
          theorem Fin.foldl_succ_last {α : Sort u_1} {n : Nat} (f : αFin (n + 1)α) (x : α) :
          foldl (n + 1) f x = f (foldl n (fun (x1 : α) (x2 : Fin n) => f x1 x2.castSucc) x) (last n)
          theorem Fin.foldl_add {α : Sort u_1} {n m : Nat} (f : αFin (n + m)α) (x : α) :
          foldl (n + m) f x = foldl m (fun (x : α) (i : Fin m) => f x (natAdd n i)) (foldl n (fun (x : α) (i : Fin n) => f x (castLE i)) x)
          theorem Fin.foldl_eq_foldlM {α : Type u_1} {n : Nat} (f : αFin nα) (x : α) :
          foldl n f x = (foldlM n (fun (x1 : α) (x2 : Fin n) => pure (f x1 x2)) x).run
          theorem Fin.foldlM_pure {m : Type u_1 → Type u_2} {α : Type u_1} {x : α} [Monad m] [LawfulMonad m] {n : Nat} {f : αFin nα} :
          foldlM n (fun (x : α) (i : Fin n) => pure (f x i)) x = pure (foldl n f x)

          foldr #

          theorem Fin.foldr_congr {α : Sort u_1} {n k : Nat} (w : n = k) (f : Fin nαα) :
          foldr n f = foldr k fun (i : Fin k) => f (Fin.cast i)
          @[simp]
          theorem Fin.foldr_zero {α : Sort u_1} (f : Fin 0αα) (x : α) :
          foldr 0 f x = x
          theorem Fin.foldr_succ {n : Nat} {α : Sort u_1} (f : Fin (n + 1)αα) (x : α) :
          foldr (n + 1) f x = f 0 (foldr n (fun (i : Fin n) => f i.succ) x)
          theorem Fin.foldr_succ_last {n : Nat} {α : Sort u_1} (f : Fin (n + 1)αα) (x : α) :
          foldr (n + 1) f x = foldr n (fun (x : Fin n) => f x.castSucc) (f (last n) x)
          theorem Fin.foldr_add {n m : Nat} {α : Sort u_1} (f : Fin (n + m)αα) (x : α) :
          foldr (n + m) f x = foldr n (fun (i : Fin n) => f (castLE i)) (foldr m (fun (i : Fin m) => f (natAdd n i)) x)
          theorem Fin.foldr_eq_foldrM {n : Nat} {α : Type u_1} (f : Fin nαα) (x : α) :
          foldr n f x = (foldrM n (fun (x1 : Fin n) (x2 : α) => pure (f x1 x2)) x).run
          theorem Fin.foldl_rev {n : Nat} {α : Sort u_1} (f : Fin nαα) (x : α) :
          foldl n (fun (x : α) (i : Fin n) => f i.rev x) x = foldr n f x
          theorem Fin.foldr_rev {α : Sort u_1} {n : Nat} (f : αFin nα) (x : α) :
          foldr n (fun (i : Fin n) (x : α) => f x i.rev) x = foldl n f x
          theorem Fin.foldrM_pure {m : Type u_1 → Type u_2} {α : Type u_1} {x : α} [Monad m] [LawfulMonad m] {n : Nat} {f : Fin nαα} :
          foldrM n (fun (i : Fin n) (x : α) => pure (f i x)) x = pure (foldr n f x)