Functional Programming and the Lambda Calculus
Stephen A. Edwards
Columbia University
Fall 2008 Functional vs. Imperative
Imperative programming concerned with “how.” Functional programming concerned with “what.” Based on the mathematics of the lambda calculus (Church as opposed to Turing). “Programming without variables” It is elegant and a difficult setting in which to create subtle bugs. It’s a cult: once you catch the functional bug, you never escape. Referential transparency
The main (good) property of functional programming is referential transparency. Every expression denotes a single value. The value cannot be changed by evaluating an expression or by sharing it between different parts of the program. No references to global data; there is no global data. There are no side-effects, unlike in referentially opaque languages. Church-Rosser
Amazing result:
Ï Any way you choose to evaluate a lambda expression can produce the same result, i.e., it is confluent. Ï “Running” a lambda calculus “program” gives a deterministic result if it terminates. Ï Each program means exactly one thing: its normal form. Ï Normal order reduction is the most general. Alonzo Church
1903–1995 Professor at Princeton (1929–1967) and UCLA (1967–1990) Invented the Lambda Calculus Had a few successful graduate students, including
Ï Stephen Kleene (Regular expressions) Ï Michael O. Rabin† (Nondeterministic automata) Ï Dana Scott† (Formal programming language semantics) Ï Alan Turing (Turing machines)
† Turing award winners Turing Machines vs. Lambda Calculus
In 1936,
Ï Alan Turing invented the Turing machine Ï Alonzo Church invented the lambda calculus
In 1937, Turing proved that the two models were equivalent, i.e., that they define the same class of computable functions. Modern processors are just overblown Turing machines. Functional languages are just the lambda calculus with a more palatable syntax.