Table of contents
Application
Formal definition
An Application is a triple :
where:
- is the function — the rule that the application enacts; specifies for each possible argument what the result will be; the function is a general specification, not yet tied to any particular argument
- is the argument — the specific input at which the function is instantiated; is drawn from the domain of ; the argument determines which of ’s many possible input-output pairs is actualized
- is the result — the output produced by applying to ; is uniquely determined by and (for a function: no choice, no branching, no non-determinism); the result is the application’s contribution to the ambient computation
One invariant. is an application iff:
- Functional uniqueness: is the unique element of assigned to by . A function assigns exactly one output to each input; application enacts this assignment for a specific input. The uniqueness is what distinguishes application from a relation (which may assign multiple outputs) and from a nondeterministic choice (which selects from a set of candidates). This invariant is not a separate condition imposed on applications but is constitutive of the concept: an application that produces two different results from the same function and argument would not be an application but a different computational concept.
Church and lambda calculus
Alonzo Church (An Unsolvable Problem of Elementary Number Theory, 1936; The Calculi of Lambda-Conversion, 1941) defined the lambda calculus — the formal system in which application is the fundamental computation step alongside abstraction.
Lambda calculus has two constructors for terms:
- Abstraction: — defines a function with parameter and body
- Application: — applies term (as function) to term (as argument)
The -reduction rule defines what application computes:
Applying the function to argument substitutes for throughout . This single rule is the complete computational content of lambda calculus — all computable functions arise from iterated -reduction.
Church’s thesis (combined with Turing’s): lambda calculus captures all effective computation. The -definable functions and the Turing-computable functions are the same class. Application (-reduction) is not just a notational device — it is the universal computational step.
-equivalence: terms differing only in bound variable names are identical (). -equivalence: when does not occur free in — a function is equal to the abstraction of its own application. Together with , these form the equational theory of lambda calculus.
Curry: combinatory logic and application without variables
Haskell B. Curry (with Robert Feys, Combinatory Logic, 1958; building on Schönfinkel 1924) developed combinatory logic — a presentation of functional computation using application but no variables or abstraction. All computation is expressed through two basic combinators:
- — the constant combinator (ignores second argument)
- — the composition combinator (distributes argument)
Every lambda term has a translation into combinatory logic; combinatory logic is equi-expressive with lambda calculus. The key insight: in combinatory logic, application is the only operation — there is no abstraction, no variables, no scoping. The computational content of lambda calculus is exactly the content expressible through iterated application of combinators.
Currying: in combinatory logic (and standard functional programming), a multi-argument function is represented as a curried function — applying to produces a new function waiting for the second argument. Application is thus iterated: . This representation makes application the universal interface: every function takes exactly one argument and returns either a result or a new function.
Reynolds and relational parametricity
John C. Reynolds (Types, Abstraction and Parametric Polymorphism, 1983) introduced relational parametricity — the study of what universally quantified types guarantee about application behavior.
For a polymorphic function , relational parametricity says: for every relation , if then where is the relation on induced by . The function applies uniformly across all types — it cannot inspect the type of its argument, only apply the operations available to .
Reynolds’ abstraction theorem: the behavior of a polymorphic function under application is entirely determined by its type. If the type says “works for all ”, the function must work relationally — it cannot distinguish between related arguments. This gives free theorems (Wadler 1989): just from the type of a function, one can derive theorems about how application of that function behaves, without ever inspecting its definition.
Relational parametricity transforms the question “what does applying this function do?” into a question about types and relations — making application behavior a consequence of type structure rather than a property that must be separately proved.
Categorical application: morphism composition
In category theory, application corresponds to morphism composition where and . Applying to yields ; applying to yields . The composite represents the sequential application.
In a cartesian closed category (CCC), application is a morphism — the evaluation map. The universal property of CCCs says: every morphism factors uniquely through via its curried form . This is the categorical statement of currying: application and abstraction are adjoint operations.
The Curry-Howard-Lambek correspondence makes application triply interpreted: it is function application (type theory), modus ponens (logic), and morphism composition (category theory). A single application step corresponds simultaneously to applying a program, applying a proof rule, and composing a morphism.
Open questions
- Whether the operational content of application (-reduction) and the denotational content (function application in a domain) always agree — whether the computational and mathematical notions of application are always coherent, or whether there are models in which -reduction steps and semantic equality diverge (as in untyped lambda calculus with -rules for arithmetic).
- Whether application in higher-dimensional type theory (cubical type theory, HoTT) has a richer structure than in simple type theory — whether applying a function to a path (proof of equality) should itself produce a path, and whether this path-application is the right higher-dimensional generalization.
- Whether relational parametricity (Reynolds) extends to effects — whether a program that applies a function with side effects can have its behavior characterized by the type alone, or whether effect annotations in the type are required to recover the abstraction theorem.
- Whether categorical evaluation in the topos has a natural interpretation in the relational universe — whether applying a morphism of the history presheaf to an element of the domain presheaf produces the right element of the codomain presheaf at each history, and whether this is the universal property of the exponential sheaf.