CS 476 – Programming Language Design William Mansky
Functional Programming • Functions are the basic unit of computation • Functions are values! (“first-class functions”) ― Functions can take functions as arguments • No mutable variables* • Usually contrasted with imperative languages • Examples: F#, OCaml, Lisp, Haskell, lambda-expressions 1
The First Functional Language • 2
The First Functional Language • 3
The First Functional Language • 4
The First Functional Language • 5
Lambda Calculus Basics • argument name “bound variable” 6
Lambda Calculus Basics • argument name “bound variable” 7
Lambda Calculus Basics • argument name “bound variable” 8
Variable Binding int f(int x){ return x + 1; } int x = 5; f(x + 2); 9
Lambda Calculus: Binding and Scope • 10
Lambda Calculus: Renaming • 11
Lambda Calculus: Renaming • 12
Lambda Calculus: Renaming • 13
Lambda Calculus: Substitution • 15
Lambda Calculus: Substitution • 16
Lambda Calculus: Substitution • 17
Lambda Calculus: Substitution • 18
Lambda Calculus: Substitution • 19
Lambda Calculus: Substitution • 20
Lambda Calculus: Substitution • 21
Lambda Calculus: Substitution • 22
Lambda Calculus: Substitution • 23
Lambda Calculus: Substitution • 24
Lambda Calculus: Substitution • 25
Lambda Calculus: Substitution • except… 26
Lambda Calculus: Substitution • except… 27
Lambda Calculus: Substitution In OCaml: let f x y = x + y; ; (* f = fun x -> fun y -> x + y *) let y = 5; ; let g = f y; ; (* g = fun y -> y + y would be wrong *) (* g = fun z -> 5 + z would be right *) 28
Lambda Calculus: Substitution • except… 29
Lambda Calculus: Substitution • 30
Lambda Calculus: Syntax • 32
Lambda Calculus: Semantics • 33
Lambda Calculus: Semantics • 34
Lambda Calculus: Semantics • 35
Lambda Calculus: Semantics • 36
Call-By-Name vs. Call-By-Value • 37
Call-By-Name vs. Call-By-Value • 38
Call-By-Name vs. Call-By-Value • 39
Lambda Calculus and Computability What can be computed? “Turing-complete” Church, 1936 Turing, 1936 40