Currying and uncurrying of n-ary functions #
A function of n
arguments can either be written as f a₁ a₂ ⋯ aₙ
or f' ![a₁, a₂, ⋯, aₙ]
.
This file provides the currying and uncurrying operations that convert between the two, as
n-ary generalizations of the binary curry
and uncurry
.
Main definitions #
Function.OfArity.uncurry
: convert ann
-ary function to a function fromFin n → α
.Function.OfArity.curry
: convert a function fromFin n → α
to ann
-ary function.Function.FromTypes.uncurry
: convert anp
-ary heterogeneous function to a function from(i : Fin n) → p i
.Function.FromTypes.curry
: convert a function from(i : Fin n) → p i
to ap
-ary heterogeneous function.
def
Function.FromTypes.uncurry
{n : ℕ}
{p : Fin n → Type u}
{τ : Type u}
(f : Function.FromTypes p τ)
:
((i : Fin n) → p i) → τ
Uncurry all the arguments of Function.FromTypes p τ
to get
a function from a tuple.
Note this can be used on raw functions if used.
Equations
Instances For
def
Function.FromTypes.curry
{n : ℕ}
{p : Fin n → Type u}
{τ : Type u}
:
(((i : Fin n) → p i) → τ) → Function.FromTypes p τ
Curry all the arguments of Function.FromTypes p τ
to get a function from a tuple.
Equations
- Function.FromTypes.curry x = x fun (a : Fin 0) => isEmptyElim a
- Function.FromTypes.curry x = fun (a : Matrix.vecHead x_4) => Function.FromTypes.curry fun (args : (i : Fin n) → Matrix.vecTail x_4 i) => x (Fin.cons a args)
Instances For
@[simp]
theorem
Function.FromTypes.uncurry_apply_cons
{n : ℕ}
{α : Type u}
{p : Fin n → Type u}
{τ : Type u}
(f : Function.FromTypes (Matrix.vecCons α p) τ)
(a : α)
(args : (i : Fin n) → p i)
:
@[simp]
theorem
Function.FromTypes.curry_apply_cons
{n : ℕ}
{α : Type u}
{p : Fin n → Type u}
{τ : Type u}
(f : ((i : Fin (n + 1)) → Matrix.vecCons α p i) → τ)
(a : α)
:
Function.FromTypes.curry f a = Function.FromTypes.curry ((fun {x : (i : Fin n) → Matrix.vecCons α p i.succ} => f) ∘' Fin.cons a)
@[simp]
theorem
Function.FromTypes.curry_uncurry
{n : ℕ}
{p : Fin n → Type u}
{τ : Type u}
(f : Function.FromTypes p τ)
:
Function.FromTypes.curry f.uncurry = f
@[simp]
theorem
Function.FromTypes.uncurry_curry
{n : ℕ}
{p : Fin n → Type u}
{τ : Type u}
(f : ((i : Fin n) → p i) → τ)
:
(Function.FromTypes.curry f).uncurry = f
@[simp]
theorem
Function.FromTypes.curryEquiv_apply
{n : ℕ}
{τ : Type u}
(p : Fin n → Type u)
:
∀ (a : ((i : Fin n) → p i) → τ), (Function.FromTypes.curryEquiv p) a = Function.FromTypes.curry a
@[simp]
theorem
Function.FromTypes.curryEquiv_symm_apply
{n : ℕ}
{τ : Type u}
(p : Fin n → Type u)
(f : Function.FromTypes p τ)
:
∀ (a : (i : Fin n) → p i), (Function.FromTypes.curryEquiv p).symm f a = f.uncurry a
def
Function.FromTypes.curryEquiv
{n : ℕ}
{τ : Type u}
(p : Fin n → Type u)
:
(((i : Fin n) → p i) → τ) ≃ Function.FromTypes p τ
Equiv.curry
for p
-ary heterogeneous functions.
Equations
- Function.FromTypes.curryEquiv p = { toFun := Function.FromTypes.curry, invFun := Function.FromTypes.uncurry, left_inv := ⋯, right_inv := ⋯ }
Instances For
theorem
Function.FromTypes.curry_two_eq_curry
{p : Fin 2 → Type u}
{τ : Type u}
(f : ((i : Fin 2) → p i) → τ)
:
Function.FromTypes.curry f = Function.curry (f ∘ ⇑(piFinTwoEquiv p).symm)
theorem
Function.FromTypes.uncurry_two_eq_uncurry
(p : Fin 2 → Type u)
(τ : Type u)
(f : Function.FromTypes p τ)
:
f.uncurry = Function.uncurry f ∘ ⇑(piFinTwoEquiv p)
def
Function.OfArity.uncurry
{α : Type u}
{β : Type u}
{n : ℕ}
(f : Function.OfArity α β n)
:
(Fin n → α) → β
Uncurry all the arguments of Function.OfArity α n
to get a function from a tuple.
Note this can be used on raw functions if used.
Equations
- f.uncurry = Function.FromTypes.uncurry f
Instances For
def
Function.OfArity.curry
{α : Type u}
{β : Type u}
{n : ℕ}
(f : (Fin n → α) → β)
:
Function.OfArity α β n
Curry all the arguments of Function.OfArity α β n
to get a function from a tuple.
Equations
Instances For
@[simp]
theorem
Function.OfArity.curry_uncurry
{α : Type u}
{β : Type u}
{n : ℕ}
(f : Function.OfArity α β n)
:
Function.OfArity.curry f.uncurry = f
@[simp]
theorem
Function.OfArity.uncurry_curry
{α : Type u}
{β : Type u}
{n : ℕ}
(f : (Fin n → α) → β)
:
(Function.OfArity.curry f).uncurry = f
@[simp]
theorem
Function.OfArity.curryEquiv_apply
{α : Type u}
{β : Type u}
(n : ℕ)
:
∀ (a : (Fin n → α) → β), (Function.OfArity.curryEquiv n) a = Function.FromTypes.curry a
@[simp]
theorem
Function.OfArity.curryEquiv_symm_apply
{α : Type u}
{β : Type u}
(n : ℕ)
(f : Function.FromTypes (fun (a : Fin n) => α) β)
:
∀ (a : Fin n → α), (Function.OfArity.curryEquiv n).symm f a = f.uncurry a
def
Function.OfArity.curryEquiv
{α : Type u}
{β : Type u}
(n : ℕ)
:
((Fin n → α) → β) ≃ Function.OfArity α β n
Equiv.curry
for n-ary functions.
Equations
- Function.OfArity.curryEquiv n = Function.FromTypes.curryEquiv fun (a : Fin n) => α
Instances For
theorem
Function.OfArity.curry_two_eq_curry
{α : Type u}
{β : Type u}
(f : (Fin 2 → α) → β)
:
Function.OfArity.curry f = Function.curry (f ∘ ⇑(finTwoArrowEquiv α).symm)
theorem
Function.OfArity.uncurry_two_eq_uncurry
{α : Type u}
{β : Type u}
(f : Function.OfArity α β 2)
:
f.uncurry = Function.uncurry f ∘ ⇑(finTwoArrowEquiv α)