Lecture 16: Programming The Polymorphic Lambda Calculus
October 29
Booleans
type bool = ALL a. a -> a -> a
val tt = /\a. \x:a. \y:a. x
val ff = /\a. \x:a. \y:a. x
val if e (e1: t) (e2: t) = e[t] e1 e2
Natural Numbers
type nat = ALL a. (a -> a) -> a -> a
val z = /\a. \m:a -> a. \n:a. n
val one = /\a. \m:a -> a. \n:a. m n
val two = /\a. \m:a -> a. \n:a. m (m n)
val three = /\a. \m:a -> a. \n:a. m (m (m n))
Pairs
type pair t1 t2 = ALL a. (t1 -> t2 -> a) -> a
val tuple (e1: t1) (e2: t2) = /\a. \f: t1 -> t2 -> a. f e1 e2
val letpair (e: pair t1 t2) (e2: t1 -> t2 -> t) = e[t] e2
val pi1 (e: pair t1 t2) = letpair e (\x:t1. \y:t2. x)
val pi2 (e: pair t1 t2) = letpair e (\x:t1. \y:t2. y)
Sums
type sum t1 t2 = ALL a. (t1 -> a) -> (t2 -> a) -> a
val inl[t1][t2] e = /\a. \f:t1 -> a. \g:t2 -> a. f e
val inr[t1][t2] e = /\a. \f:t1 -> a. \g:t2 -> a. g e
val case e (e1 : t1 -> t) (e2 : t2 -> t) = e[t] e1 e2
Lists
type list t = ALL a. (t -> a -> a) -> a -> a
val nil[t] = /\a. \c: t -> a -> a. \n: a. n
val l1 (e: t) = /\a. \c: t -> a -> a \n: a. c e n
val l2 (e1: t) (e2: t) = /\a. \c: t -> a -> a. \n: a. c e1 (c e2 n)
val foldr (f : t -> b -> b) (n: b) (l: list t) = l[b] c n
$LastChangedDate: 2008-11-10 11:52:21 -0500 (Mon, 10 Nov 2008) $
$Author: rjsimmon $
$Rev: 1029 $