Programming with Lambda (Pre Lecture)

Dr. Neil T. Dantam

CSCI-400, Colorado School of Mines

Spring 2021

Dantam (Mines CSCI-400) Lambda Spring 2021 1/29 Origin of Lambda: What’s an “algorithm”? Entscheidungsproblem: mathematical true algorithm statement false

λ-calculus Turing machines

David Hilbert

Alan Turing

Dantam (Mines CSCI-400) Lambda Spring 2021 2/29 Introduction

Lambda Outcomes ◮ Lambda: the ultimate operator ◮ Implement common language ◮ Everything programmable can be constructs using Lambda programmed with lambda ◮ Practical: if a language lacks a desired feature, but has lambda, you can implement that feature with lambda (see also: JavaScript)

Dantam (Mines CSCI-400) Lambda Spring 2021 3/29 Lambda Expression Review Function Definition Function Application formal parameter function λ . z}|{x α z}|{f y body actual parameter |{z} |{z} ◮ Create an unnamed function. ◮ Bind actual parameter y to ◮ The function is itself a value. the formal parameter of f . ◮ Do not evaluate the body until applied (called) ◮ Evaluate the body of f . Example a = 2 + (λa . 1+ a) 2 1 + 2 3

Dantam (Mines CSCI-400) Lambda Spring 2021 4/29 Lambda: Very Important! Review

◮ Lambda can perform any possible computation! ◮ Trivial with Lambda: ◮ N-ary functions ◮ Variable binding (let) “I’m kind of a big deal.” ◮ Statements (;) ◮ Named functions ◮ OOP ◮ Also possible with Lambda: ◮ Recursion λ ◮ Conditionals (if) ◮ Lists ◮ Structs ◮ Arithmetic (+, −, etc.)

Dantam (Mines CSCI-400) Lambda Spring 2021 5/29 Lambda: Very Important! Review

◮ Lambda can perform any possible computation! ◮ Trivial with Lambda: ◮ N-ary functions ◮ Variable binding (let) “I’m kind of a big deal.” ◮ Statements (;) ◮ Named functions ◮ OOP ◮ Also possible with Lambda: ◮ Recursion λ ◮ Conditionals (if) ◮ Lists ◮ Structs ◮ Arithmetic (+, −, etc.)

Dantam (Mines CSCI-400) Lambda Spring 2021 6/29 Binary and N-ary Functions Outline

Binary and N-ary Functions

Bindings

Dantam (Mines CSCI-400) Lambda Spring 2021 7/29 Binary and N-ary Functions Binary Functions Reduction of Binary to Unary Functions Example λ . Binary Unary ( ab a + b) 1 2 formal params. body λx .λy . e λ x y . e z}|{ z}|{ (λa .λb . a + b) 1 2 ◮ Convert to two lambdas a = 1 ◮ Outer lambda binds first param (x) and (λb . 1+ b) 2 returns inner lambda ◮ Inner lambda binds second param (y) and b = 2 evaluates 1 + 2

Each function call creates new bindings of its arguments.

Dantam (Mines CSCI-400) Lambda Spring 2021 8/29 Binary and N-ary Functions N-ary Functions

N-ary functions Example arity: n + 1 arity: n (λabc . a + b + c) 1 2 3

λx0 x1 ... xn . e λx0 . (λx1 ... xn . α)

(λa .λbc . a + b + c) 1 2 3 ◮ Recursively convert to unary functions.

(λa .λb .λc . a + b + c) 1 2 3

Dantam (Mines CSCI-400) Lambda Spring 2021 9/29 Binary and N-ary Functions N-ary Functions example, continued

Example (λabc . a + b + c) 1 2 3 (λb .λc . 1+ b + c) 2 3 b = 2 λ .λ . λ . ( a bc a + b + c) 1 2 3 = 1 ( c 1+2+ c) 3

a c = 3 (λa .λb .λc . a + b + c) 1 2 3 1 + 2 + 3 + 6

Dantam (Mines CSCI-400) Lambda Spring 2021 10/29 Binary and N-ary Functions : Specializing Functions

Binary Curry

curry ≡ λf a . (λb . f ab)

Function curry(f, a) 1 function g(b) is f(a,b) 2 g

Example curry (λab . a + b) 42 Haskell B. Curry λb . (λab . a + b) 42 b λb . 42 + b

Dantam (Mines CSCI-400) Lambda Spring 2021 11/29 Binary and N-ary Functions Historical Interlude 0: of Lambda Curry, Hilbert, Church, and Turing

“decision problem” via λ-calculus “decision problem” via Turing machines Alonzo Church

Haskell Curry Alan Turing Dantam (Mines CSCI-400) Lambda Spring 2021 12/29 Binary and N-ary Functions Exercise: Currying

Reduce the n-ary functions to unary functions:

◮ λxy . xy

◮ λxyz . (xy)+ z

Dantam (Mines CSCI-400) Lambda Spring 2021 13/29 Bindings Outline

Binary and N-ary Functions

Bindings

Dantam (Mines CSCI-400) Lambda Spring 2021 14/29 Bindings Let Expression Review

Let Expression Evaluation ◮ let x ← e1 in e2 Evaluate e1 v1 ◮ identifier binding exp. body exp. Substitute v1 for x in e2, |{z} |{z} |{z} ′ yielding new e2 ◮ ′ Evaluate e2 v2

Dantam (Mines CSCI-400) Lambda Spring 2021 15/29 Bindings Example: Let and Lambda

Example (Variable Binding) Example (Function Application)

let a ← 2 in 1+ a (λa . 1+ a) 2 a = 2 a=2 1 + 2 1 + 2 + + 3 3

Notice the similarity?

Dantam (Mines CSCI-400) Lambda Spring 2021 16/29 Bindings Let to Lambda Reduction of Let to Lambda Let Lambda identifier binding exp. body exp. identifier body exp. binding exp. λ . let z}|{x ← z}|{e1 in z}|{e2 ( z}|{x z}|{e2 ) z}|{e1

◮ Identifier x becomes lambda parameter ◮ Body exp. e2 becomes the lambda body ◮ Binding exp. e1 becomes the call argument

Example let λ a = 2 + let a ← 2 in 1+ a (λa . 1+ a) 2 1 + 2 3

Dantam (Mines CSCI-400) Lambda Spring 2021 17/29 Bindings Sequential Definition

Sequential Definition identifier binding exp. Example var x ← e1 ; z}|{ z}|{ e2 var a ← 2; 1+ a body |{z} a = 2 Evaluation ◮ 1 + 2 Evaluate e1 v1 ◮ + Substitute v1 for x in e2, ′ yielding new e2 3 ◮ ′ Evaluate e2 v2

Dantam (Mines CSCI-400) Lambda Spring 2021 18/29 Bindings Example: Sequential Definitions and Let

Example (Sequential Definition) Example (Let)

var a ← 2; let a ← 2 in 1+ a 1+ a a = 2 a = 2 1 + 2 1 + 2 + + 3 3

Dantam (Mines CSCI-400) Lambda Spring 2021 19/29 Bindings Sequential Definition to Let

Reduction of Sequential Definition to Let Sequential Def. identifier binding exp. Let var x ← e1 ; identifier binding exp. body z}|{ z}|{ e2 let x ← e1 in e2 z}|{ z}|{ z}|{ body |{z}

Example var a ← 2; let a ← 2 in 1+ a (λa . 1+ a) 2 1 + 2 3 1+ a

Dantam (Mines CSCI-400) Lambda Spring 2021 20/29 Bindings Named Local Functions

Example flet f (a) → 1+ a in f 2 Local Functions

name a = 2 formal param. fun. body flet body   1 + 2 flet f x → e1 in e2 z}|{ z}|{ z}|{ z}|{   + 3

Dantam (Mines CSCI-400) Lambda Spring 2021 21/29 Bindings Example: Local Functions and Let/Lambda

Example (Local Function) Example (Let and Lambda)

flet f (a) → 1+ a in f 2 let f ← λa . 1+ a in f 2 a = 2 f = λa . 1+ a 1 + 2 (λa . 1+ a) 2 + a = 2 3 1 + 2 + 3

Dantam (Mines CSCI-400) Lambda Spring 2021 22/29 Bindings Local Functions to Let and Lambda

Reduction of Local Functions to Let and Lambda Local Function name Let / Lambda formal param. fun. body flet body   let f ← λx . e1 in e2 flet f x → e1 in e2 z}|{ z}|{ z}|{ z}|{  

Example ... flet f (a) → 1+ a in f 2 let f ← λa . 1+ a in f 2 (λa . 1+ a) 2

Dantam (Mines CSCI-400) Lambda Spring 2021 23/29 Bindings Global Functions to Local Functions

Reduction Global Functions to Sequential Assignment Global Function name formal param. fun body   defun f x → e1 ; Local Function z}|{ z}|{ z}|{   flet f (x) → e1 in e2 e2 more expressions |{z}

Example defun f (a) → 1+ a; ... flet f (a) → 1+ a in f 2 let f ← λa . 1+ a in f 2 f 2

Dantam (Mines CSCI-400) Lambda Spring 2021 24/29 Bindings Example: Reduction to Lambda

name binding exp body name body binding exp ◮   let    a=2 let a ← 2 in 1+ a  λ a . 1+ a 2  1 + 2  z}|{ z}|{ z }| {  z}|{ z }| { z}|{             +    3 ◮ let x ← 1 in (let y ← 2 in x + y) let x let y (λx . let y ← 2 in x + y) 1 (λx . λy . x + y) 1 2 x=1 y=1 + (λy . 1+ y) 2 1 + 2 3 ◮ flet f (x) → if x then 1 else 0 in f true flet let f ← λx . if x then 1 else 0 in f true let (λf . f true)(λx . if x then 1 else 0) f =λx . ... (λx . if x then 1 else 0) true x=true if if true then 1 else 0 1

Dantam (Mines CSCI-400) Lambda Spring 2021 25/29 Bindings Exercise: Reduction to Lambda ◮ let x ← 1 in λa . x + a ◮ (let x ← 1 in λa . x + a) 2

◮ flet f (a b) → a + b in f 1 2

◮ flet f (n) → (if n = 0 then 1 else n ∗ f (n − 1)) in f 2

Dantam (Mines CSCI-400) Lambda Spring 2021 26/29 Bindings Summary We can program with lambda?

◮ Everything is an expression var n-ary ◮ Everything is a lambda ◮ We’ve seen: let, var, flet, defun ◮ Also possible: Recursion, Conditionals, Lists, Arithmetic ◮ More to come: defun let ◮ How do we actually implement lambda? λ ◮ How do we detect errors at compile time and avoid errors at runtime? ◮ What other programming “tricks” can we now use? if {+, −, /, ∗}

Dantam (Mines CSCI-400) Lambda Spring 2021 27/29 Bindings Historical Interlude 1: From Lambda to

Alonzo Church. A set of postulates for the foundation of (). 1932. John McCarthy. Recursive Functions of Symbolic Expressions and Their Computation by Machine, Part I. (Lisp). 1960.

Guy Steele, Jr. Lambda: The ultimate {imperative, declarative}. (Scheme). 1976.

Dantam (Mines CSCI-400) Lambda Spring 2021 28/29 Bindings References

◮ Pierce. Type Systems and Programming Languages. ◮ Ch 5.2 Programming in the Lambda-Calculus

Dantam (Mines CSCI-400) Lambda Spring 2021 29/29