Notes on the simply-typed λ-calculus

Introduction

These notes give a brief recap of the simply-typed λ-calculus, its typing and evaluation, and pointers to where each rule is implemented in Stlc3.hs.

Syntax

The syntax of λ-calculus expressions is as follows.

Expression Meaning Constructor
1, 2, 3 Integer constants EInt
True, False Boolean constants EBool
e1 + e2 Addition EAdd
e1 - e2 Subtraction ESubt
e1 * e2 Multiplication EMult
isz e Zero test EIs0
if e1 then e2 else e3 Conditional EIf
\x : t -> e Function abstraction ELam
e1 e2 Function application EApp
let x = e1 in e2 Name binding ELet
(e1, e2) Pair introduction EPair
let (x1, x2) = e1 in e2 Pair elimination ELetPair
() Unit introduction EUnit
e1; e2 Unit elimination ELetUnit
fix e Fixed point EFix
Note: the following two forms were introduced in Hw1, and follow the naming scheme therefrom.
Inl[t+u] e, Inr[t+u] e Sum introduction CInl, CInr
case e of Inl x1 -> e1 | Inr x2 -> e2 Sum elimination CCase
The syntax of λ-calculus types is as follows
Type Meaning Constructor
Int Integers TInt
Bool Booleans TBool
t1 -> t2 Functions TFun
t1 * t2 Products TProd
The following type was introduced in Hw1, and follows the naming scheme therefrom.
t1 + t2 Sums CTSum

Typing

Typing judgments take the form $\Gamma \vdash e : t$, where $\Gamma$ is a typing environment (i.e., an association of variable names to types), $e$ is a λ-calculus expression, and $t$ is a λ-calculus type.

Not all valid λ-calculus expressions built following the rules above are meaningful. For example, neither True + 4 or \x : Bool -> x + x are meaningful expressions. Typing can be thought of as characterizing those terms which do have meaning.

Alternatively, if we assume the evaluating an non-meaningful term would give rise to an error, typing can be thought of as an approximation of evaluation that determines whether or not expressions will give rise to errors.

Typing is implemented by the function check :: TEnv -> Expr -> Maybe Type, where TEnv is a list of identifiers and types, and the result of Just t if the input expression has type t, and Nothing otherwise.

Typing rule Code reference
$$\frac{ }{\Gamma \vdash 1 : \Int}$$ Stlc3.hs, 42–43
$$\frac{\Gamma \vdash e_1 : \Int \quad \Gamma \vdash e_2 : \Int}{\Gamma \vdash e_1 + e_2 : \Int}$$ Stlc3.hs, 44–47
$$\frac{\Gamma \vdash e_1 : \Int \quad \Gamma \vdash e_2 : \Int}{\Gamma \vdash e_1 - e_2 : \Int}$$ Stlc3.hs, 48–51
$$\frac{\Gamma \vdash e_1 : \Int \quad \Gamma \vdash e_2 : \Int}{\Gamma \vdash e_1 * e_2 : \Int}$$ Stlc3.hs, 52–55
$$\frac{ }{\Gamma \vdash \mathtt{True} : \Bool}$$ Stlc3.hs, 56–57
$$\frac{\Gamma \vdash e : \Int}{\Gamma \vdash \mathtt{isz}\,e : \Bool}$$ Stlc3.hs, 58–60
$$\frac{\Gamma \vdash e_1 : \Bool \quad \Gamma \vdash e_2 : t \quad \Gamma \vdash e_3 : t} {\Gamma \vdash \If{e_1}{e_2}{e_3} : t}$$ Stlc3.hs, 61–65
$$\frac{(x : t) \in \Gamma}{\Gamma \vdash x : t}$$ Stlc3.hs, 66–67
$$\frac{\Gamma, x : t \vdash e : u}{\Gamma \vdash \mathtt{\backslash x : t \to e : t \to u}}$$ Stlc3.hs, 68–70
$$\frac{\Gamma \vdash e_1 : t \to u \quad \Gamma \vdash e_2 : t}{\Gamma \vdash e_1\,e_2 : u}$$ Stlc.hs, 71–74
$$\frac{\Gamma \vdash e_1 : t \quad \Gamma, x : t \vdash e_2 : u} {\Gamma \vdash \Let{x}{e_1}{e_2} : u}$$ Stlc.hs, 75–77
$$\frac{\Gamma \vdash e_1 : t_1 \quad \Gamma \vdash e_2 : t_2} {\Gamma \vdash (e_1, e_2) : t_1 * t_2}$$ Stlc.hs, 78–81
$$\frac{\Gamma \vdash e_1 : t_1 * t_2 \quad \Gamma, x_1 : t_1, x_2 : t_2 \vdash e_2 : u} {\Gamma \vdash \Let{(x_1,x_2)}{e_1}{e_2} : u}$$ Stlc.hs, 82–84
$$\frac{ }{\Gamma \vdash () : 1}$$ Stlc.hs, 85–86
$$\frac{\Gamma \vdash e_1 : 1 \quad \Gamma \vdash e_2 : t} {\Gamma \vdash e_1; e_2 : t}$$ Stlc.hs, 87–89
$$\frac{\Gamma \vdash e : (t \to u) \to (t \to u)} {\Gamma \vdash \mathtt{fix}\,e : t \to u}$$ Stlc.hs, 90–92
$$\frac{\Gamma \vdash e : t}{\Gamma \vdash \Inl t u e : t + u}$$ Hw1Solutions/Core.hs, 63–65
$$\frac{\Gamma \vdash e : u}{\Gamma \vdash \Inr t u e : t + u}$$ Hw1Solutions/Core.hs, 66–68
$$\frac{\Gamma \vdash e : t_1 + t_2 \quad \Gamma, x_1 : t_1 \vdash e_1 : u \quad \Gamma, x_2 : t_2 \vdash e_2 : u} {\Gamma \vdash \CCase e {x_1} {e_1} {x_2} {e_2} : u}$$ Hw1Solutions/Core.hs, 69–73

Evaluation

Evaluation judgments take the form $e \Eval v$, where $e$ is a λ-calculus expression and $v$ is a value. They are defined in terms of substitution $[x \mapsto v]e$, which denotes the expression $e$ in which all occurrences of variable $x$ have been replaced by value $v$.

Values are as follows:

Value Meaning Constructor
$1$, $2$, $3$ Integer values VInt
$\mathtt{True}$, $\mathtt{False}$ Boolean values VBool
$\lambda x.e$ Function values VFun
See the notes on environments for discussion of the implementation of function values
$\langle v_1, v_2 \rangle$ Pair values VPair
$\langle \rangle$ Unit value VUnit
$\Vinl v$, $\Vinr v$ Sum values VInl, VInr

Our implementation of evaluation uses environments rather than using substitutions directly. So, evaluation is implemented by a function eval of type VEnv -> Expr -> Value, where VEnv maps variable identifiers to values.

Evaluation rule Code reference
$$\frac{ } {1 \Eval 1}$$ Stlc3.hs, 111–112
$$\frac{e_1 \Eval v_1 \quad e_2 \Eval v_2} {e_1 + e_2 \Eval v_1 + v_2}$$ Stlc3.hs, 113–116
$$\frac{e_1 \Eval v_1 \quad e_2 \Eval v_2} {e_1 - e_2 \Eval v_1 - v_2}$$ Stlc3.hs, 117–120
$$\frac{e_1 \Eval v_1 \quad e_2 \Eval v_2} {e_1 * e_2 \Eval v_1 \times v_2}$$ Stlc3.hs, 121–124
$$\frac{ } {\mathtt{True} \Eval \mathtt{True}}$$ Stlc3.hs, 125–126
$$\frac{e \Eval 0} {\mathtt{isz}\,e \Eval \mathtt{True}} \qquad \frac{e \Eval n \quad n \not= 0} {\mathtt{isz}\,e \Eval \mathtt{False}}$$ Stlc3.hs, 127–129
$$\frac{e_1 \Eval \mathtt{True} \quad e_2 \Eval v} {\If{e_1}{e_2}{e_3} \Eval v} \qquad \frac{e_1 \Eval \mathtt{False} \quad e_3 \Eval v} {\If{e_1}{e_2}{e_3} \Eval v}$$ Stlc3.hs, 130–132
$$\frac{ } {\mathtt{\backslash x : t \to e} \Eval \lambda x.e}$$ Stlc3.hs, 135–136
$$\frac{e_1 \Eval \lambda x. e \quad e_2 \Eval w \quad [x \mapsto w]e \Eval v} {e_1\,e_2 \Eval v}$$ Stlc3.hs, 137–140
$$\frac{e_1 \Eval w \quad [x \mapsto w]e_2 \Eval v} {\Let{x}{e_1}{e_2} \Eval v}$$ Stlc3.hs, 141–143
$$\frac{e_1 \Eval v_1 \quad e_2 \Eval v_2} {(e_1, e_2) \Eval \langle v_1, v_2 \rangle}$$ Stlc3.hs, 144–147
$$\frac{e_1 \Eval \langle w_1,w_2 \rangle \quad [x_1 \mapsto w_1, x_2 \mapsto w_2]e_2 \Eval v} {\Let{(x_1,x_2)}{e_1}{e_2} \Eval v}$$ Stlc3.hs, 148–150
$$\frac{ } {() \Eval \langle \rangle}$$ Stlc3.hs, 151–152
$$\frac{e_1 \Eval \langle\rangle \quad e_2 \Eval v} {e_1; e_2 \Eval v}$$ Stlc3.hs, 153–155
$$\frac{ } {\mathtt{fix}\,e \Eval \lambda x. e\,(\mathtt{fix}\,e)\,x}$$ Stlc3.hs, 156–157
See the notes on recursion for a more detailed discussion of fixed points.
$$\frac{e \Eval v} {\Inl t u e \Eval \Vinl v} \qquad \frac{e \Eval v} {\Inl t u e \Eval \Vinr v}$$ Hw1Solutions/Core.hs, 119–124
$$\frac{e \Eval \Vinl w \quad [x_1 \mapsto w]e_1 \Eval v} {\CCase{e}{x_1}{e_1}{x_2}{e_2} \Eval v}$$
$$\frac{e \Eval \Vinr w \quad [x_2 \mapsto w]e_2 \Eval v} {\CCase{e}{x_1}{e_1}{x_2}{e_2} \Eval v}$$
Hw1Solutions/Core.hs, 125–129