Functional Programming Languages Liam OConnor CSE, UNSW (and - - PowerPoint PPT Presentation

functional programming languages liam o connor
SMART_READER_LITE
LIVE PREVIEW

Functional Programming Languages Liam OConnor CSE, UNSW (and - - PowerPoint PPT Presentation

The Functional Paradigm MinHS Functional Programming Languages Liam OConnor CSE, UNSW (and data61) Term3 2019 1 The Functional Paradigm MinHS Functional Programming Many languages have been called functional over the years: Lisp (


slide-1
SLIDE 1

The Functional Paradigm MinHS

Functional Programming Languages Liam O’Connor

CSE, UNSW (and data61) Term3 2019

1

slide-2
SLIDE 2

The Functional Paradigm MinHS

Functional Programming

Many languages have been called functional over the years: Lisp (define (max-of lst) (cond [(= (length lst) 1) (first lst)] [else (max (first lst) (max-of (rest lst)))]))

2

slide-3
SLIDE 3

The Functional Paradigm MinHS

Functional Programming

Many languages have been called functional over the years: Lisp (define (max-of lst) (cond [(= (length lst) 1) (first lst)] [else (max (first lst) (max-of (rest lst)))])) Haskell maxOf :: [Int] → Int maxOf = foldr1 max

3

slide-4
SLIDE 4

The Functional Paradigm MinHS

Functional Programming

Many languages have been called functional over the years: Lisp (define (max-of lst) (cond [(= (length lst) 1) (first lst)] [else (max (first lst) (max-of (rest lst)))])) Haskell maxOf :: [Int] → Int maxOf = foldr1 max JavaScript? function maxOf(arr) { var max = arr.reduce(function(a, b) { return Math.max(a, b); }); }

4

slide-5
SLIDE 5

The Functional Paradigm MinHS

Functional Programming

Many languages have been called functional over the years: Lisp (define (max-of lst) (cond [(= (length lst) 1) (first lst)] [else (max (first lst) (max-of (rest lst)))])) Haskell maxOf :: [Int] → Int maxOf = foldr1 max JavaScript? function maxOf(arr) { var max = arr.reduce(function(a, b) { return Math.max(a, b); }); } What do they have in common?

5

slide-6
SLIDE 6

The Functional Paradigm MinHS

Definitions

Unlike imperative languages, functional programming languages are not very crisply defined. Attempt at a Definition A functional programming language is a programming language derived from or inspired by the λ-calculus, or derived from or inspired by another functional programming language. The result? If it has λ in it, you can call it functional.

6

slide-7
SLIDE 7

The Functional Paradigm MinHS

Definitions

Unlike imperative languages, functional programming languages are not very crisply defined. Attempt at a Definition A functional programming language is a programming language derived from or inspired by the λ-calculus, or derived from or inspired by another functional programming language. The result? If it has λ in it, you can call it functional. In this course, we’ll consider purely functional languages, which have a much better definition.

7

slide-8
SLIDE 8

The Functional Paradigm MinHS

Why Study FP Languages?

Think of a major innovation in the area of programming languages. Garbage Collection?

slide-9
SLIDE 9

The Functional Paradigm MinHS

Why Study FP Languages?

Think of a major innovation in the area of programming languages. Garbage Collection? Lisp, 1958

slide-10
SLIDE 10

The Functional Paradigm MinHS

Why Study FP Languages?

Think of a major innovation in the area of programming languages. Garbage Collection? Lisp, 1958 Functions as Values?

slide-11
SLIDE 11

The Functional Paradigm MinHS

Why Study FP Languages?

Think of a major innovation in the area of programming languages. Garbage Collection? Lisp, 1958 Functions as Values? Lisp, 1958

slide-12
SLIDE 12

The Functional Paradigm MinHS

Why Study FP Languages?

Think of a major innovation in the area of programming languages. Garbage Collection? Lisp, 1958 Functions as Values? Lisp, 1958 Polymorphism?

slide-13
SLIDE 13

The Functional Paradigm MinHS

Why Study FP Languages?

Think of a major innovation in the area of programming languages. Garbage Collection? Lisp, 1958 Functions as Values? Lisp, 1958 Polymorphism? ML, 1973

slide-14
SLIDE 14

The Functional Paradigm MinHS

Why Study FP Languages?

Think of a major innovation in the area of programming languages. Garbage Collection? Lisp, 1958 Functions as Values? Lisp, 1958 Polymorphism? ML, 1973 Type Inference?

slide-15
SLIDE 15

The Functional Paradigm MinHS

Why Study FP Languages?

Think of a major innovation in the area of programming languages. Garbage Collection? Lisp, 1958 Functions as Values? Lisp, 1958 Polymorphism? ML, 1973 Type Inference? ML, 1973

slide-16
SLIDE 16

The Functional Paradigm MinHS

Why Study FP Languages?

Think of a major innovation in the area of programming languages. Garbage Collection? Lisp, 1958 Functions as Values? Lisp, 1958 Polymorphism? ML, 1973 Type Inference? ML, 1973 Metaprogramming?

slide-17
SLIDE 17

The Functional Paradigm MinHS

Why Study FP Languages?

Think of a major innovation in the area of programming languages. Garbage Collection? Lisp, 1958 Functions as Values? Lisp, 1958 Polymorphism? ML, 1973 Type Inference? ML, 1973 Metaprogramming? Lisp, 1958

slide-18
SLIDE 18

The Functional Paradigm MinHS

Why Study FP Languages?

Think of a major innovation in the area of programming languages. Garbage Collection? Lisp, 1958 Functions as Values? Lisp, 1958 Polymorphism? ML, 1973 Type Inference? ML, 1973 Metaprogramming? Lisp, 1958 Lazy Evaluation?

slide-19
SLIDE 19

The Functional Paradigm MinHS

Why Study FP Languages?

Think of a major innovation in the area of programming languages. Garbage Collection? Lisp, 1958 Functions as Values? Lisp, 1958 Polymorphism? ML, 1973 Type Inference? ML, 1973 Metaprogramming? Lisp, 1958 Lazy Evaluation? Miranda, 1985

slide-20
SLIDE 20

The Functional Paradigm MinHS

Why Study FP Languages?

Think of a major innovation in the area of programming languages. Garbage Collection? Lisp, 1958 Functions as Values? Lisp, 1958 Polymorphism? ML, 1973 Type Inference? ML, 1973 Metaprogramming? Lisp, 1958 Lazy Evaluation? Miranda, 1985 Monads?

slide-21
SLIDE 21

The Functional Paradigm MinHS

Why Study FP Languages?

Think of a major innovation in the area of programming languages. Garbage Collection? Lisp, 1958 Functions as Values? Lisp, 1958 Polymorphism? ML, 1973 Type Inference? ML, 1973 Metaprogramming? Lisp, 1958 Lazy Evaluation? Miranda, 1985 Monads? Haskell, 1991

slide-22
SLIDE 22

The Functional Paradigm MinHS

Why Study FP Languages?

Think of a major innovation in the area of programming languages. Garbage Collection? Lisp, 1958 Functions as Values? Lisp, 1958 Polymorphism? ML, 1973 Type Inference? ML, 1973 Metaprogramming? Lisp, 1958 Lazy Evaluation? Miranda, 1985 Monads? Haskell, 1991 Software Transactional Memory?

slide-23
SLIDE 23

The Functional Paradigm MinHS

Why Study FP Languages?

Think of a major innovation in the area of programming languages. Garbage Collection? Lisp, 1958 Functions as Values? Lisp, 1958 Polymorphism? ML, 1973 Type Inference? ML, 1973 Metaprogramming? Lisp, 1958 Lazy Evaluation? Miranda, 1985 Monads? Haskell, 1991 Software Transactional Memory? GHC Haskell, 2005

23

slide-24
SLIDE 24

The Functional Paradigm MinHS

Purely Functional Programming Languages

The term purely functional has a very crisp definition. Definition A programming language is purely functional if β-reduction (or evaluation in general) is actually a confluence. In other words, functions have to be mathematical functions, and free of side effects.

24

slide-25
SLIDE 25

The Functional Paradigm MinHS

Purely Functional Programming Languages

The term purely functional has a very crisp definition. Definition A programming language is purely functional if β-reduction (or evaluation in general) is actually a confluence. In other words, functions have to be mathematical functions, and free of side effects. Consider what would happen if we allowed effects in a functional language: count = 0; f x = {count := count + x; return count}; m = (λy. y + y) (f 3) If we evaluate f 3 first, we will get m = 6, but if we β-reduce m first, we will get m = 9. ⇒ not confluent.

25

slide-26
SLIDE 26

The Functional Paradigm MinHS

Making a Functional Language

We’re going to make a language called MinHS.

1

Three types of values: integers, booleans, and functions.

26

slide-27
SLIDE 27

The Functional Paradigm MinHS

Making a Functional Language

We’re going to make a language called MinHS.

1

Three types of values: integers, booleans, and functions.

2

Static type checking (not inference)

27

slide-28
SLIDE 28

The Functional Paradigm MinHS

Making a Functional Language

We’re going to make a language called MinHS.

1

Three types of values: integers, booleans, and functions.

2

Static type checking (not inference)

3

Purely functional (no effects)

28

slide-29
SLIDE 29

The Functional Paradigm MinHS

Making a Functional Language

We’re going to make a language called MinHS.

1

Three types of values: integers, booleans, and functions.

2

Static type checking (not inference)

3

Purely functional (no effects)

4

Call-by-value (strict evaluation)

29

slide-30
SLIDE 30

The Functional Paradigm MinHS

Making a Functional Language

We’re going to make a language called MinHS.

1

Three types of values: integers, booleans, and functions.

2

Static type checking (not inference)

3

Purely functional (no effects)

4

Call-by-value (strict evaluation) In your Assignment 1, you will be implementing an evaluator for a slightly less minimal dialect of MinHS.

30

slide-31
SLIDE 31

The Functional Paradigm MinHS

Syntax

Integers n ::= · · · Identifiers f , x ::= · · · Literals b ::= True | False Types τ ::= Bool | Int | τ1 → τ2 Infix Operators ⊛ ::= * | + | == | · · · Expressions e ::= x | n | b | (e) | e1 ⊛ e2 | if e1 then e2 else e3

31

slide-32
SLIDE 32

The Functional Paradigm MinHS

Syntax

Integers n ::= · · · Identifiers f , x ::= · · · Literals b ::= True | False Types τ ::= Bool | Int | τ1 → τ2 Infix Operators ⊛ ::= * | + | == | · · · Expressions e ::= x | n | b | (e) | e1 ⊛ e2 | if e1 then e2 else e3 | e1 e2

32

slide-33
SLIDE 33

The Functional Paradigm MinHS

Syntax

Integers n ::= · · · Identifiers f , x ::= · · · Literals b ::= True | False Types τ ::= Bool | Int | τ1 → τ2 Infix Operators ⊛ ::= * | + | == | · · · Expressions e ::= x | n | b | (e) | e1 ⊛ e2 | if e1 then e2 else e3 | e1 e2 | recfun f :: (τ1 → τ2) x = e ↑ Like λ, but with recursion. As usual, this is ambiguous concrete syntax. But all the precedence and associativity rule apply as in Haskell. We assume a suitable parser.

33

slide-34
SLIDE 34

The Functional Paradigm MinHS

Examples

Example (Stupid division by 5) recfun divBy5 :: (Int → Int) x = if x < 5 then 0 else 1 + divBy5 (x − 5) Example (Average Function) recfun average :: (Int → (Int → Int)) x = recfun avX :: (Int → Int) y = (x + y) / 2 As in Haskell, (average 15 5) = ((average 15) 5).

34

slide-35
SLIDE 35

The Functional Paradigm MinHS

We don’t need no let

This language is so minimal, it doesn’t even need let expressions. How can we do without them?

35

slide-36
SLIDE 36

The Functional Paradigm MinHS

We don’t need no let

This language is so minimal, it doesn’t even need let expressions. How can we do without them? let x :: τ1 = e1 in e2 :: τ2 ≡ (recfun f :: (τ1 → τ2) x = e2) e1

36

slide-37
SLIDE 37

The Functional Paradigm MinHS

Abstract Syntax

Moving to first order abstract syntax, we get:

1

Things like numbers and boolean literals are wrapped in terms (Num, Lit)

2

Operators like a + b become (Plus a b).

37

slide-38
SLIDE 38

The Functional Paradigm MinHS

Abstract Syntax

Moving to first order abstract syntax, we get:

1

Things like numbers and boolean literals are wrapped in terms (Num, Lit)

2

Operators like a + b become (Plus a b).

3

if c then t else e becomes (If c t e).

38

slide-39
SLIDE 39

The Functional Paradigm MinHS

Abstract Syntax

Moving to first order abstract syntax, we get:

1

Things like numbers and boolean literals are wrapped in terms (Num, Lit)

2

Operators like a + b become (Plus a b).

3

if c then t else e becomes (If c t e).

4

Function applications e1 e2 become explicit (Apply e1 e2).

39

slide-40
SLIDE 40

The Functional Paradigm MinHS

Abstract Syntax

Moving to first order abstract syntax, we get:

1

Things like numbers and boolean literals are wrapped in terms (Num, Lit)

2

Operators like a + b become (Plus a b).

3

if c then t else e becomes (If c t e).

4

Function applications e1 e2 become explicit (Apply e1 e2).

5

recfun f :: (τ1 → τ2) x = e becomes (Recfun τ1 τ2 f x e).

40

slide-41
SLIDE 41

The Functional Paradigm MinHS

Abstract Syntax

Moving to first order abstract syntax, we get:

1

Things like numbers and boolean literals are wrapped in terms (Num, Lit)

2

Operators like a + b become (Plus a b).

3

if c then t else e becomes (If c t e).

4

Function applications e1 e2 become explicit (Apply e1 e2).

5

recfun f :: (τ1 → τ2) x = e becomes (Recfun τ1 τ2 f x e).

6

Variable usages are wrapped in a term (Var x).

41

slide-42
SLIDE 42

The Functional Paradigm MinHS

Abstract Syntax

Moving to first order abstract syntax, we get:

1

Things like numbers and boolean literals are wrapped in terms (Num, Lit)

2

Operators like a + b become (Plus a b).

3

if c then t else e becomes (If c t e).

4

Function applications e1 e2 become explicit (Apply e1 e2).

5

recfun f :: (τ1 → τ2) x = e becomes (Recfun τ1 τ2 f x e).

6

Variable usages are wrapped in a term (Var x). What changes when we move to higher order abstract syntax?

42

slide-43
SLIDE 43

The Functional Paradigm MinHS

Abstract Syntax

Moving to first order abstract syntax, we get:

1

Things like numbers and boolean literals are wrapped in terms (Num, Lit)

2

Operators like a + b become (Plus a b).

3

if c then t else e becomes (If c t e).

4

Function applications e1 e2 become explicit (Apply e1 e2).

5

recfun f :: (τ1 → τ2) x = e becomes (Recfun τ1 τ2 f x e).

6

Variable usages are wrapped in a term (Var x). What changes when we move to higher order abstract syntax?

1

Var terms go away – we use the meta-language’s variables.

2

(Recfun τ1 τ2 f x e) now uses meta-language abstraction: (Recfun τ1 τ2 (f . x. e)).

43

slide-44
SLIDE 44

The Functional Paradigm MinHS

Working Statically with HOAS

To Code We’re going to write code for an AST and pretty-printer for MinHS with HOAS. Seeing as this requires us to look under abstractions without evaluating the term, we have to extend the AST with special “tag” values.

44

slide-45
SLIDE 45

The Functional Paradigm MinHS

Static Semantics

To check if a MinHS program is well-formed, we need to check:

1

Scoping – all variables used must be well defined

2

Typing – all operations must be used on compatible types.

45

slide-46
SLIDE 46

The Functional Paradigm MinHS

Static Semantics

To check if a MinHS program is well-formed, we need to check:

1

Scoping – all variables used must be well defined

2

Typing – all operations must be used on compatible types. Our judgement is an extension of the scoping rules to include types:

Γ ⊢ e : τ

Under this context of assumptions The expression is assigned this type The context Γ includes typing assumptions for the variables:

x : Int, y : Int ⊢ (Plus x y) : Int

46

slide-47
SLIDE 47

The Functional Paradigm MinHS

Static Semantics

Γ ⊢ (Num n) : Int Γ ⊢ (Lit b) : Bool Γ ⊢ e1 : Int Γ ⊢ e2 : Int Γ ⊢ (Plus e1 e2) : Int Γ ⊢ (If e1 e2 e3) : Let’s implement a type checker.

slide-48
SLIDE 48

The Functional Paradigm MinHS

Static Semantics

Γ ⊢ (Num n) : Int Γ ⊢ (Lit b) : Bool Γ ⊢ e1 : Int Γ ⊢ e2 : Int Γ ⊢ (Plus e1 e2) : Int Γ ⊢ (If e1 e2 e3) : Let’s implement a type checker.

48

slide-49
SLIDE 49

The Functional Paradigm MinHS

Static Semantics

Γ ⊢ (Num n) : Int Γ ⊢ (Lit b) : Bool Γ ⊢ e1 : Int Γ ⊢ e2 : Int Γ ⊢ (Plus e1 e2) : Int Γ ⊢ e1 : Bool Γ ⊢ (If e1 e2 e3) : Let’s implement a type checker.

49

slide-50
SLIDE 50

The Functional Paradigm MinHS

Static Semantics

Γ ⊢ (Num n) : Int Γ ⊢ (Lit b) : Bool Γ ⊢ e1 : Int Γ ⊢ e2 : Int Γ ⊢ (Plus e1 e2) : Int Γ ⊢ e1 : Bool Γ ⊢ e2 : τ Γ ⊢ e3 : τ Γ ⊢ (If e1 e2 e3) : τ Let’s implement a type checker.

50

slide-51
SLIDE 51

The Functional Paradigm MinHS

Static Semantics

Γ ⊢ (Num n) : Int Γ ⊢ (Lit b) : Bool Γ ⊢ e1 : Int Γ ⊢ e2 : Int Γ ⊢ (Plus e1 e2) : Int Γ ⊢ e1 : Bool Γ ⊢ e2 : τ Γ ⊢ e3 : τ Γ ⊢ (If e1 e2 e3) : τ (x : τ) ∈ Γ Γ ⊢ x : τ Let’s implement a type checker.

51

slide-52
SLIDE 52

The Functional Paradigm MinHS

Static Semantics

Γ ⊢ (Num n) : Int Γ ⊢ (Lit b) : Bool Γ ⊢ e1 : Int Γ ⊢ e2 : Int Γ ⊢ (Plus e1 e2) : Int Γ ⊢ e1 : Bool Γ ⊢ e2 : τ Γ ⊢ e3 : τ Γ ⊢ (If e1 e2 e3) : τ (x : τ) ∈ Γ Γ ⊢ x : τ Γ, ⊢ e : τ2 Γ ⊢ (Recfun τ1 τ2 (f . x. e)) : Let’s implement a type checker.

52

slide-53
SLIDE 53

The Functional Paradigm MinHS

Static Semantics

Γ ⊢ (Num n) : Int Γ ⊢ (Lit b) : Bool Γ ⊢ e1 : Int Γ ⊢ e2 : Int Γ ⊢ (Plus e1 e2) : Int Γ ⊢ e1 : Bool Γ ⊢ e2 : τ Γ ⊢ e3 : τ Γ ⊢ (If e1 e2 e3) : τ (x : τ) ∈ Γ Γ ⊢ x : τ Γ, x : τ1, ⊢ e : τ2 Γ ⊢ (Recfun τ1 τ2 (f . x. e)) : Let’s implement a type checker.

53

slide-54
SLIDE 54

The Functional Paradigm MinHS

Static Semantics

Γ ⊢ (Num n) : Int Γ ⊢ (Lit b) : Bool Γ ⊢ e1 : Int Γ ⊢ e2 : Int Γ ⊢ (Plus e1 e2) : Int Γ ⊢ e1 : Bool Γ ⊢ e2 : τ Γ ⊢ e3 : τ Γ ⊢ (If e1 e2 e3) : τ (x : τ) ∈ Γ Γ ⊢ x : τ Γ, x : τ1, f : (τ1 → τ2) ⊢ e : τ2 Γ ⊢ (Recfun τ1 τ2 (f . x. e)) : Let’s implement a type checker.

54

slide-55
SLIDE 55

The Functional Paradigm MinHS

Static Semantics

Γ ⊢ (Num n) : Int Γ ⊢ (Lit b) : Bool Γ ⊢ e1 : Int Γ ⊢ e2 : Int Γ ⊢ (Plus e1 e2) : Int Γ ⊢ e1 : Bool Γ ⊢ e2 : τ Γ ⊢ e3 : τ Γ ⊢ (If e1 e2 e3) : τ (x : τ) ∈ Γ Γ ⊢ x : τ Γ, x : τ1, f : (τ1 → τ2) ⊢ e : τ2 Γ ⊢ (Recfun τ1 τ2 (f . x. e)) : τ1 → τ2 Γ ⊢ (Apply e1 e2) : Let’s implement a type checker.

55

slide-56
SLIDE 56

The Functional Paradigm MinHS

Static Semantics

Γ ⊢ (Num n) : Int Γ ⊢ (Lit b) : Bool Γ ⊢ e1 : Int Γ ⊢ e2 : Int Γ ⊢ (Plus e1 e2) : Int Γ ⊢ e1 : Bool Γ ⊢ e2 : τ Γ ⊢ e3 : τ Γ ⊢ (If e1 e2 e3) : τ (x : τ) ∈ Γ Γ ⊢ x : τ Γ, x : τ1, f : (τ1 → τ2) ⊢ e : τ2 Γ ⊢ (Recfun τ1 τ2 (f . x. e)) : τ1 → τ2 Γ ⊢ e1 : τ1 → τ2 Γ ⊢ (Apply e1 e2) : Let’s implement a type checker.

56

slide-57
SLIDE 57

The Functional Paradigm MinHS

Static Semantics

Γ ⊢ (Num n) : Int Γ ⊢ (Lit b) : Bool Γ ⊢ e1 : Int Γ ⊢ e2 : Int Γ ⊢ (Plus e1 e2) : Int Γ ⊢ e1 : Bool Γ ⊢ e2 : τ Γ ⊢ e3 : τ Γ ⊢ (If e1 e2 e3) : τ (x : τ) ∈ Γ Γ ⊢ x : τ Γ, x : τ1, f : (τ1 → τ2) ⊢ e : τ2 Γ ⊢ (Recfun τ1 τ2 (f . x. e)) : τ1 → τ2 Γ ⊢ e1 : τ1 → τ2 Γ ⊢ e2 : τ1 Γ ⊢ (Apply e1 e2) : Let’s implement a type checker.

57

slide-58
SLIDE 58

The Functional Paradigm MinHS

Static Semantics

Γ ⊢ (Num n) : Int Γ ⊢ (Lit b) : Bool Γ ⊢ e1 : Int Γ ⊢ e2 : Int Γ ⊢ (Plus e1 e2) : Int Γ ⊢ e1 : Bool Γ ⊢ e2 : τ Γ ⊢ e3 : τ Γ ⊢ (If e1 e2 e3) : τ (x : τ) ∈ Γ Γ ⊢ x : τ Γ, x : τ1, f : (τ1 → τ2) ⊢ e : τ2 Γ ⊢ (Recfun τ1 τ2 (f . x. e)) : τ1 → τ2 Γ ⊢ e1 : τ1 → τ2 Γ ⊢ e2 : τ1 Γ ⊢ (Apply e1 e2) : τ2 Let’s implement a type checker.

58

slide-59
SLIDE 59

The Functional Paradigm MinHS

Dynamic Semantics

Structural Operational Semantics (Small-Step) Initial states:

59

slide-60
SLIDE 60

The Functional Paradigm MinHS

Dynamic Semantics

Structural Operational Semantics (Small-Step) Initial states: All well typed expressions. Final states:

60

slide-61
SLIDE 61

The Functional Paradigm MinHS

Dynamic Semantics

Structural Operational Semantics (Small-Step) Initial states: All well typed expressions. Final states: (Num n), (Lit b),

61

slide-62
SLIDE 62

The Functional Paradigm MinHS

Dynamic Semantics

Structural Operational Semantics (Small-Step) Initial states: All well typed expressions. Final states: (Num n), (Lit b), Recfun too! Evaluation of built-in operations: e1 → e′

1

(Plus e1 e2) → (Plus e′

1 e2)

(and so on as per arithmetic expressions)

62

slide-63
SLIDE 63

The Functional Paradigm MinHS

Specifying If

e1 → e′

1

(If e1 e2 e3) → (If e′

1 e2 e3)

(If (Lit True) e2 e3) → e2 (If (Lit False) e2 e3) → e3

63

slide-64
SLIDE 64

The Functional Paradigm MinHS

How about Functions?

Recall that Recfun is a final state – we don’t need to evaluate it when it’s alone. Evaluating function application requires us to:

1

Evaluate the left expression to get the function being applied

2

Evaluate the right expression to get the argument value

3

Evaluate the function’s body, after supplying substitutions for the abstracted variables.

e1 → e′

1

(Apply e1 e2) → (Apply e′

1 e2)

e2 → e′

2

(Apply (Recfun . . . ) e2) → (Apply (Recfun . . . ) e′

2)

slide-65
SLIDE 65

The Functional Paradigm MinHS

How about Functions?

Recall that Recfun is a final state – we don’t need to evaluate it when it’s alone. Evaluating function application requires us to:

1

Evaluate the left expression to get the function being applied

2

Evaluate the right expression to get the argument value

3

Evaluate the function’s body, after supplying substitutions for the abstracted variables.

e1 → e′

1

(Apply e1 e2) → (Apply e′

1 e2)

e2 → e′

2

(Apply (Recfun . . . ) e2) → (Apply (Recfun . . . ) e′

2)

65

slide-66
SLIDE 66

The Functional Paradigm MinHS

How about Functions?

Recall that Recfun is a final state – we don’t need to evaluate it when it’s alone. Evaluating function application requires us to:

1

Evaluate the left expression to get the function being applied

2

Evaluate the right expression to get the argument value

3

Evaluate the function’s body, after supplying substitutions for the abstracted variables.

e1 → e′

1

(Apply e1 e2) → (Apply e′

1 e2)

e2 → e′

2

(Apply (Recfun . . . ) e2) → (Apply (Recfun . . . ) e′

2)

v ∈ F (Apply (Recfun τ1 τ2 (f .x. e)) v) → e[x := v, f := (Recfun τ1 τ2 (f .x. e))]

66