Functional Programming First class functions, lambdas and...

Preview:

Citation preview

Paradigms Pure Rec Delegates Lambdas Closures More Quiz JS Java

Functional ProgrammingFirst class functions, lambdas and closures

Radu NicolescuDepartment of Computer Science

University of Auckland

23 July 2018

1 / 61

Paradigms Pure Rec Delegates Lambdas Closures More Quiz JS Java

1 Programming paradigms

2 Pure FP

3 Recursion

4 C# Delegates

5 Lambda expressions

6 Closures

7 More Lambdas

8 Quiz – Simple scenarios

9 Lambdas in Javascript

10 Lambdas in Java

2 / 61

Paradigms Pure Rec Delegates Lambdas Closures More Quiz JS Java

Outline

1 Programming paradigms

2 Pure FP

3 Recursion

4 C# Delegates

5 Lambda expressions

6 Closures

7 More Lambdas

8 Quiz – Simple scenarios

9 Lambdas in Javascript

10 Lambdas in Java

3 / 61

Paradigms Pure Rec Delegates Lambdas Closures More Quiz JS Java

Programming paradigms

• Object-oriented: develop complex objects starting with simpleobjects (using inheritance, aggregation, delegation, ...)

• Functional: develop complex functions starting with simplefunctions (using function composition, Kleisli, ...)

• Object-oriented or functional?

• Object-oriented and functional! More dimensions, more tools!

• Most modern languages evolve towards a multi-paradigm style

• Object-first: C#, Java, C++, ...

• Functional-first: F#, Javascript (Lisp in Java syntax), ...

• Object-functional: Scala, ...

4 / 61

Paradigms Pure Rec Delegates Lambdas Closures More Quiz JS Java

Programming paradigms

• Object-oriented: develop complex objects starting with simpleobjects (using inheritance, aggregation, delegation, ...)

• Functional: develop complex functions starting with simplefunctions (using function composition, Kleisli, ...)

• Object-oriented or functional?

• Object-oriented and functional! More dimensions, more tools!

• Most modern languages evolve towards a multi-paradigm style

• Object-first: C#, Java, C++, ...

• Functional-first: F#, Javascript (Lisp in Java syntax), ...

• Object-functional: Scala, ...

4 / 61

Paradigms Pure Rec Delegates Lambdas Closures More Quiz JS Java

Programming paradigms

• Object-oriented: develop complex objects starting with simpleobjects (using inheritance, aggregation, delegation, ...)

• Functional: develop complex functions starting with simplefunctions (using function composition, Kleisli, ...)

• Object-oriented or functional?

• Object-oriented and functional! More dimensions, more tools!

• Most modern languages evolve towards a multi-paradigm style

• Object-first: C#, Java, C++, ...

• Functional-first: F#, Javascript (Lisp in Java syntax), ...

• Object-functional: Scala, ...

4 / 61

Paradigms Pure Rec Delegates Lambdas Closures More Quiz JS Java

Programming paradigms

• Object-oriented: develop complex objects starting with simpleobjects (using inheritance, aggregation, delegation, ...)

• Functional: develop complex functions starting with simplefunctions (using function composition, Kleisli, ...)

• Object-oriented or functional?

• Object-oriented and functional! More dimensions, more tools!

• Most modern languages evolve towards a multi-paradigm style

• Object-first: C#, Java, C++, ...

• Functional-first: F#, Javascript (Lisp in Java syntax), ...

• Object-functional: Scala, ...

4 / 61

Paradigms Pure Rec Delegates Lambdas Closures More Quiz JS Java

Programming paradigms

• Object-oriented: develop complex objects starting with simpleobjects (using inheritance, aggregation, delegation, ...)

• Functional: develop complex functions starting with simplefunctions (using function composition, Kleisli, ...)

• Object-oriented or functional?

• Object-oriented and functional! More dimensions, more tools!

• Most modern languages evolve towards a multi-paradigm style

• Object-first: C#, Java, C++, ...

• Functional-first: F#, Javascript (Lisp in Java syntax), ...

• Object-functional: Scala, ...

4 / 61

Paradigms Pure Rec Delegates Lambdas Closures More Quiz JS Java

Programming paradigms

• Object-oriented: develop complex objects starting with simpleobjects (using inheritance, aggregation, delegation, ...)

• Functional: develop complex functions starting with simplefunctions (using function composition, Kleisli, ...)

• Object-oriented or functional?

• Object-oriented and functional! More dimensions, more tools!

• Most modern languages evolve towards a multi-paradigm style

• Object-first: C#, Java, C++, ...

• Functional-first: F#, Javascript (Lisp in Java syntax), ...

• Object-functional: Scala, ...

4 / 61

Paradigms Pure Rec Delegates Lambdas Closures More Quiz JS Java

Programming paradigms

• Object-oriented: develop complex objects starting with simpleobjects (using inheritance, aggregation, delegation, ...)

• Functional: develop complex functions starting with simplefunctions (using function composition, Kleisli, ...)

• Object-oriented or functional?

• Object-oriented and functional! More dimensions, more tools!

• Most modern languages evolve towards a multi-paradigm style

• Object-first: C#, Java, C++, ...

• Functional-first: F#, Javascript (Lisp in Java syntax), ...

• Object-functional: Scala, ...

4 / 61

Paradigms Pure Rec Delegates Lambdas Closures More Quiz JS Java

Programming paradigms

• Object-oriented: develop complex objects starting with simpleobjects (using inheritance, aggregation, delegation, ...)

• Functional: develop complex functions starting with simplefunctions (using function composition, Kleisli, ...)

• Object-oriented or functional?

• Object-oriented and functional! More dimensions, more tools!

• Most modern languages evolve towards a multi-paradigm style

• Object-first: C#, Java, C++, ...

• Functional-first: F#, Javascript (Lisp in Java syntax), ...

• Object-functional: Scala, ...

4 / 61

Paradigms Pure Rec Delegates Lambdas Closures More Quiz JS Java

Side-bar: functions and methods

• In classical OOP, functions only appear as methods:

• Static/class methods

• Instance methods (cf. this pointer)

• Other languages, including FP, have standalone, eventop-level, functions

• Problem: how to represent anonymous inline functions (suchas lambdas) in OOP?

• Solution: embed these in the current object, if possible, orinside hidden automatically constructed objects – more atclosures

5 / 61

Paradigms Pure Rec Delegates Lambdas Closures More Quiz JS Java

Side-bar: functions and methods

• In classical OOP, functions only appear as methods:

• Static/class methods

• Instance methods (cf. this pointer)

• Other languages, including FP, have standalone, eventop-level, functions

• Problem: how to represent anonymous inline functions (suchas lambdas) in OOP?

• Solution: embed these in the current object, if possible, orinside hidden automatically constructed objects – more atclosures

5 / 61

Paradigms Pure Rec Delegates Lambdas Closures More Quiz JS Java

Side-bar: functions and methods

• In classical OOP, functions only appear as methods:

• Static/class methods

• Instance methods (cf. this pointer)

• Other languages, including FP, have standalone, eventop-level, functions

• Problem: how to represent anonymous inline functions (suchas lambdas) in OOP?

• Solution: embed these in the current object, if possible, orinside hidden automatically constructed objects – more atclosures

5 / 61

Paradigms Pure Rec Delegates Lambdas Closures More Quiz JS Java

Basic ingredients of FP

• first-class and higher order functions (aka, functionals)

• informally, you can work with functions as with any otherobjects – and compose them!

• you can have functions that take functions as parameters andreturn functions (functions which may be dynamicallycomposed)

• currying or partial application of functions

• memoization (or caching) of function results

• no side effects and immutable values (next slide)

6 / 61

Paradigms Pure Rec Delegates Lambdas Closures More Quiz JS Java

Basic ingredients of FP

• first-class and higher order functions (aka, functionals)

• informally, you can work with functions as with any otherobjects – and compose them!

• you can have functions that take functions as parameters andreturn functions (functions which may be dynamicallycomposed)

• currying or partial application of functions

• memoization (or caching) of function results

• no side effects and immutable values (next slide)

6 / 61

Paradigms Pure Rec Delegates Lambdas Closures More Quiz JS Java

Basic ingredients of FP

• first-class and higher order functions (aka, functionals)

• informally, you can work with functions as with any otherobjects – and compose them!

• you can have functions that take functions as parameters andreturn functions (functions which may be dynamicallycomposed)

• currying or partial application of functions

• memoization (or caching) of function results

• no side effects and immutable values (next slide)

6 / 61

Paradigms Pure Rec Delegates Lambdas Closures More Quiz JS Java

Basic ingredients of FP

• first-class and higher order functions (aka, functionals)

• informally, you can work with functions as with any otherobjects – and compose them!

• you can have functions that take functions as parameters andreturn functions (functions which may be dynamicallycomposed)

• currying or partial application of functions

• memoization (or caching) of function results

• no side effects and immutable values (next slide)

6 / 61

Paradigms Pure Rec Delegates Lambdas Closures More Quiz JS Java

Basic ingredients of FP

• first-class and higher order functions (aka, functionals)

• informally, you can work with functions as with any otherobjects – and compose them!

• you can have functions that take functions as parameters andreturn functions (functions which may be dynamicallycomposed)

• currying or partial application of functions

• memoization (or caching) of function results

• no side effects and immutable values (next slide)

6 / 61

Paradigms Pure Rec Delegates Lambdas Closures More Quiz JS Java

Basic ingredients of FP

• first-class and higher order functions (aka, functionals)

• informally, you can work with functions as with any otherobjects – and compose them!

• you can have functions that take functions as parameters andreturn functions (functions which may be dynamicallycomposed)

• currying or partial application of functions

• memoization (or caching) of function results

• no side effects and immutable values (next slide)

6 / 61

Paradigms Pure Rec Delegates Lambdas Closures More Quiz JS Java

Outline

1 Programming paradigms

2 Pure FP

3 Recursion

4 C# Delegates

5 Lambda expressions

6 Closures

7 More Lambdas

8 Quiz – Simple scenarios

9 Lambdas in Javascript

10 Lambdas in Java

7 / 61

Paradigms Pure Rec Delegates Lambdas Closures More Quiz JS Java

Pure FP

• Function results should only depend on parameter values

• No side effects: Functions should not change the global stateor any persistent state (unlike object methods which changethe object’s state)

• Immutable values: Ideally, functions should not change anyvalue at all! – This is possible if we use recursion instead ofclassical loops...

• As one of the advantages, programs will be easier to provecorrect, to optimize or to parallelize

8 / 61

Paradigms Pure Rec Delegates Lambdas Closures More Quiz JS Java

Pure FP

• Function results should only depend on parameter values

• No side effects: Functions should not change the global stateor any persistent state (unlike object methods which changethe object’s state)

• Immutable values: Ideally, functions should not change anyvalue at all! – This is possible if we use recursion instead ofclassical loops...

• As one of the advantages, programs will be easier to provecorrect, to optimize or to parallelize

8 / 61

Paradigms Pure Rec Delegates Lambdas Closures More Quiz JS Java

Pure FP

• Function results should only depend on parameter values

• No side effects: Functions should not change the global stateor any persistent state (unlike object methods which changethe object’s state)

• Immutable values: Ideally, functions should not change anyvalue at all! – This is possible if we use recursion instead ofclassical loops...

• As one of the advantages, programs will be easier to provecorrect, to optimize or to parallelize

8 / 61

Paradigms Pure Rec Delegates Lambdas Closures More Quiz JS Java

Pure FP

• Function results should only depend on parameter values

• No side effects: Functions should not change the global stateor any persistent state (unlike object methods which changethe object’s state)

• Immutable values: Ideally, functions should not change anyvalue at all! – This is possible if we use recursion instead ofclassical loops...

• As one of the advantages, programs will be easier to provecorrect, to optimize or to parallelize

8 / 61

Paradigms Pure Rec Delegates Lambdas Closures More Quiz JS Java

Pure FP

• For example, if f and g don’t change any global variable norany of their parameters (i.e., a, b, c , d), the following twostatements can run in parallel, on a dual-core machine:

1 x = f ( a , b ) ; — function f could be evaluated on core #123 y = g ( c , d ) ; — function g could be evaluated on core #2

• However, many practical languages, including C# (and F#),do accept side effects, although some of them will try toexplicit or localize these (e.g., via so-called monads)

9 / 61

Paradigms Pure Rec Delegates Lambdas Closures More Quiz JS Java

Pure FP

• For example, if f and g don’t change any global variable norany of their parameters (i.e., a, b, c , d), the following twostatements can run in parallel, on a dual-core machine:

1 x = f ( a , b ) ; — function f could be evaluated on core #123 y = g ( c , d ) ; — function g could be evaluated on core #2

• However, many practical languages, including C# (and F#),do accept side effects, although some of them will try toexplicit or localize these (e.g., via so-called monads)

9 / 61

Paradigms Pure Rec Delegates Lambdas Closures More Quiz JS Java

Variables and mutability in C#

• Class fields and properties : vast topic, but not much of ourconcern here...

• var or normal declarations are mutable

1 var x = 1 0 ; x = x + 1 ;2 i n t x = 1 0 ; x = x + 1 ;

• const defines compile-time immutable values

1 const x = 1 0 ;

• readonly defines run-time immutable fields – maybe differentlyinitialised in constructors, but then is frozen

1 readonly i n t x ;

10 / 61

Paradigms Pure Rec Delegates Lambdas Closures More Quiz JS Java

Variables and mutability in C#

• Shallow vs deep immutability

• Shallow immutable complex objects such as arrays

1 c l a s s C {2 pub l i c s t a t i c readonly i n t [ ] A3 = new in t [ ] { 10 , 20 , 30 , } ;4 }56 void Main ( ) {7 var B = new in t [ ] { 100 , 200 , 300 , } ;8 // C . A = B ; // NOT allowed9 C . A [ 1 ] = 2 0 0 ; // allowed!

10 C . A . Dump ( ) ;11 }

• Conclusions: flexible but porous

11 / 61

Paradigms Pure Rec Delegates Lambdas Closures More Quiz JS Java

Variables and mutability in F#

• Class fields and properties : vast topic, but not much of ourconcern here...

• let declarations are immutable – not “variables” but values

1 l e t x = 10

• x = x + 1 is legal (!) but does NOT mean what one wouldthink: it is a boolean equality test that returns false !

• Mutable variables must be explicitly declared so

1 l e t mutable x = 102 x <− x + 1

• Increased awareness: the assignment to a mutable variableuses a distinct op sign <−

12 / 61

Paradigms Pure Rec Delegates Lambdas Closures More Quiz JS Java

Variables and mutability in F#

• Still shallow immutable arrays (but not other objects)

1 l e t A = [ | 1 0 ; 2 0 ; 3 0 ; | ] // A itself is immutable2 A . [ 1 ] <− 200 // allowed!3 A . Dump ( )

• Why this exception for arrays? Because of the HUGE body ofscientific algorithms, which have been developed andoptimised for FORTRAN mutable arrays

• F# encourages a more pure style, and promotes increasedawareness of mutability – but still allows one the choice to useother styles

13 / 61

Paradigms Pure Rec Delegates Lambdas Closures More Quiz JS Java

Variables and mutability in JS

• var declarations are mutable with global scope or function“global” scope

1 var x = 10

• let declarations are mutable with block local scope

1 i f ( b ) {2 l e t x = 103 x = x + 14 }

• const declarations are immutable with block local scope

1 i f ( b ) {2 const x = 103 // x = x + 1 // not allowed4 }

• More in part (M) 14 / 61

Paradigms Pure Rec Delegates Lambdas Closures More Quiz JS Java

Outline

1 Programming paradigms

2 Pure FP

3 Recursion

4 C# Delegates

5 Lambda expressions

6 Closures

7 More Lambdas

8 Quiz – Simple scenarios

9 Lambdas in Javascript

10 Lambdas in Java

15 / 61

Paradigms Pure Rec Delegates Lambdas Closures More Quiz JS Java

Imperative factorial

• F#

1 l e t f a c t n : i n t =2 l e t mutable m = n3 l e t mutable f = 14 whi le (m >= 1) do5 f <− f ∗ m6 m <− m − 17 f89 p r i n t f n ” I m p e r a t i v e : %A” ( f a c t 5)

16 / 61

Paradigms Pure Rec Delegates Lambdas Closures More Quiz JS Java

Naive recursive factorial

• F#

1 l e t rec f a c t ’ n =2 i f n <= 0 then 13 e l s e ( f a c t ’ ( n−1)) ∗ n45 p r i n t f n ” Naive R e c u r s i v e : %A” ( f a c t ’ 5)

• Performance issues, stack overflow

17 / 61

Paradigms Pure Rec Delegates Lambdas Closures More Quiz JS Java

Tail recursive factorial

• F#

1 l e t f a c t ’ ’ n =2 l e t rec f a c t t a i l r e c n acc =3 i f ( n <= 0) then acc4 e l s e f a c t t a i l r e c ( n−1) ( n∗ acc )5 f a c t t a i l r e c n 167 p r i n t f n ” T a i l R e c u r s i v e : %A” ( f a c t ’ ’ 5)

• F# : TCO = Tail Call Optimisation

• NO performance issues, NO stack overflow

18 / 61

Paradigms Pure Rec Delegates Lambdas Closures More Quiz JS Java

Tail recursive factorial – reverse engineered

• C# : recursion ⇒ while loop!

1 s t a t i c i n t f a c t t a i l r e c ( i n t n , i n t acc ) {2 whi le ( n > 0) {3 acc = n ∗ acc ;4 n = n − 1 ;5 }6 return acc ;7 }8 pub l i c s t a t i c i n t f a c t ( i n t n ) {9 return f a c t t a i l r e c ( n , 1 ) ;

10 }

• NO performance issues, NO stack overflow

19 / 61

Paradigms Pure Rec Delegates Lambdas Closures More Quiz JS Java

Outline

1 Programming paradigms

2 Pure FP

3 Recursion

4 C# Delegates

5 Lambda expressions

6 Closures

7 More Lambdas

8 Quiz – Simple scenarios

9 Lambdas in Javascript

10 Lambdas in Java

20 / 61

Paradigms Pure Rec Delegates Lambdas Closures More Quiz JS Java

C# Delegates in a nutshell

• Consider this scenario

1 c l a s s C {2 pub l i c i n t F ( i n t x ) { return x +1; }3 pub l i c i n t G ( i n t y ) { return y+y ; }4 pub l i c s t a t i c i n t H ( i n t z ) { return z∗ z ; }5 }

• What do these three methods have in common?

• Their signature: int→int

• Usage (assuming using static System.Console)

1 W r i t e L i n e ($”{ c1 . F ( 3 )} { c2 . G( 3 )} {C .H( 3 )} ” ) ;2 // 4 6 9

21 / 61

Paradigms Pure Rec Delegates Lambdas Closures More Quiz JS Java

C# Delegates in a nutshell

• Same scenario

1 c l a s s C {2 pub l i c i n t F ( i n t x ) { return x +1; }3 pub l i c i n t G ( i n t y ) { return y+y ; }4 pub l i c s t a t i c i n t H ( i n t z ) { return z∗ z ; }5 }

• More flexible usage using typed function pointers!

1 Func <int , int> f = c1 . F ;2 Func <int , int> g = c2 . G ;3 Func <int , int> h = C .H;4 W r i t e L i n e ($”{ f ( 3 )} {g ( 3 )} {h ( 3 )} ” ) ;5 // 4 6 9

• The same pointer, e.g. f, could point in turn to all thesemethods!

22 / 61

Paradigms Pure Rec Delegates Lambdas Closures More Quiz JS Java

C# Delegates

• A delegate is a .NET type-safe pointer to a function, i.e. to aclass or instance method

• To call an instance method: obj .F (...)

• To call a static method: Class .H (...)

• Technically, a delegate is an object with two properties

• Method: a pointer to the instance or class method (F, H)

• Target – for instance methods: pointer to actual object (obj)

• instance method calls depend on the actual target object

• Target – for static methods: null (usually)

• static methods can be fully resolved by the compiler (so theactual class is not needed at runtime)

23 / 61

Paradigms Pure Rec Delegates Lambdas Closures More Quiz JS Java

C# Delegates

• A delegate is a .NET type-safe pointer to a function, i.e. to aclass or instance method

• To call an instance method: obj .F (...)

• To call a static method: Class .H (...)

• Technically, a delegate is an object with two properties

• Method: a pointer to the instance or class method (F, H)

• Target – for instance methods: pointer to actual object (obj)

• instance method calls depend on the actual target object

• Target – for static methods: null (usually)

• static methods can be fully resolved by the compiler (so theactual class is not needed at runtime)

23 / 61

Paradigms Pure Rec Delegates Lambdas Closures More Quiz JS Java

C# Delegates

• A delegate is a .NET type-safe pointer to a function, i.e. to aclass or instance method

• To call an instance method: obj .F (...)

• To call a static method: Class .H (...)

• Technically, a delegate is an object with two properties

• Method: a pointer to the instance or class method (F, H)

• Target – for instance methods: pointer to actual object (obj)

• instance method calls depend on the actual target object

• Target – for static methods: null (usually)

• static methods can be fully resolved by the compiler (so theactual class is not needed at runtime)

23 / 61

Paradigms Pure Rec Delegates Lambdas Closures More Quiz JS Java

C# Delegates

• A delegate is a .NET type-safe pointer to a function, i.e. to aclass or instance method

• To call an instance method: obj .F (...)

• To call a static method: Class .H (...)

• Technically, a delegate is an object with two properties

• Method: a pointer to the instance or class method (F, H)

• Target – for instance methods: pointer to actual object (obj)

• instance method calls depend on the actual target object

• Target – for static methods: null (usually)

• static methods can be fully resolved by the compiler (so theactual class is not needed at runtime)

23 / 61

Paradigms Pure Rec Delegates Lambdas Closures More Quiz JS Java

C# Delegates

• A delegate is a .NET type-safe pointer to a function, i.e. to aclass or instance method

• To call an instance method: obj .F (...)

• To call a static method: Class .H (...)

• Technically, a delegate is an object with two properties

• Method: a pointer to the instance or class method (F, H)

• Target – for instance methods: pointer to actual object (obj)

• instance method calls depend on the actual target object

• Target – for static methods: null (usually)

• static methods can be fully resolved by the compiler (so theactual class is not needed at runtime)

23 / 61

Paradigms Pure Rec Delegates Lambdas Closures More Quiz JS Java

C# Delegates

• A delegate is a .NET type-safe pointer to a function, i.e. to aclass or instance method

• To call an instance method: obj .F (...)

• To call a static method: Class .H (...)

• Technically, a delegate is an object with two properties

• Method: a pointer to the instance or class method (F, H)

• Target – for instance methods: pointer to actual object (obj)

• instance method calls depend on the actual target object

• Target – for static methods: null (usually)

• static methods can be fully resolved by the compiler (so theactual class is not needed at runtime)

23 / 61

Paradigms Pure Rec Delegates Lambdas Closures More Quiz JS Java

Predefined delegate types in C# – Function types in F#

1 Func<T1 , T2 , . . . , Tn , TResult> (n ∈ {0, 1, 2, . . . , 16}) // C#23 f : T1∗T2 ∗ . . . ∗Tm − > un i t // F#

• functions taking T1,T2 ,..., Tn and returning TResult, i.e.

• f : T1× T2× . . .Tn→ TResult – maths notation.

1 Act ion<T1 , T2 , . . . , Tm> (m ∈ {0, 1, 2, . . . , 16}) // C#23 f : T1∗T2 ∗ . . . ∗Tm − > un i t // F#

• “functions” taking T1,T2 ,..., Tm and returning void , i.e.

• f : T1× T2× . . .Tm→ void – maths-like notation.

• unit is the F# “void” type, with one single value ()

24 / 61

Paradigms Pure Rec Delegates Lambdas Closures More Quiz JS Java

Predefined delegate types in C# – Function types in F#

1 Func<T1 , T2 , . . . , Tn , TResult> (n ∈ {0, 1, 2, . . . , 16}) // C#23 f : T1∗T2 ∗ . . . ∗Tm − > un i t // F#

• functions taking T1,T2 ,..., Tn and returning TResult, i.e.

• f : T1× T2× . . .Tn→ TResult – maths notation.

1 Act ion<T1 , T2 , . . . , Tm> (m ∈ {0, 1, 2, . . . , 16}) // C#23 f : T1∗T2 ∗ . . . ∗Tm − > un i t // F#

• “functions” taking T1,T2 ,..., Tm and returning void , i.e.

• f : T1× T2× . . .Tm→ void – maths-like notation.

• unit is the F# “void” type, with one single value ()

24 / 61

Paradigms Pure Rec Delegates Lambdas Closures More Quiz JS Java

Delegates – visualisation

To visualise the target of a delegate to a method, consider thefollowing scenario (Linqpad)

• a class C – nested in the outer Linqpad class, UserQuery

1 c l a s s C {2 pub l i c i n t X { get ; set ; }3 pub l i c i n t F ( i n t v ) { return v + X ; }4 pub l i c s t a t i c i n t G( i n t v ) { return v + 1 0 0 ; }5 }

• two instances of C, o1 and o2

1 var o1 = new C { X = 10 , } ;2 var o2 = new C { X = 20 , } ;34 W r i t e L i n e ($”{o1 . F ( 1 )} , {o2 . F ( 1 )} , {C . G( 1 )} ” ) ;5 // 11 , 21 , 101

25 / 61

Paradigms Pure Rec Delegates Lambdas Closures More Quiz JS Java

Delegates – visualisation

To visualise the target of a delegate to a method, consider thefollowing scenario (Linqpad)

• a class C – nested in the outer Linqpad class, UserQuery

1 c l a s s C {2 pub l i c i n t X { get ; set ; }3 pub l i c i n t F ( i n t v ) { return v + X ; }4 pub l i c s t a t i c i n t G( i n t v ) { return v + 1 0 0 ; }5 }

• two instances of C, o1 and o2

1 var o1 = new C { X = 10 , } ;2 var o2 = new C { X = 20 , } ;34 W r i t e L i n e ($”{o1 . F ( 1 )} , {o2 . F ( 1 )} , {C . G( 1 )} ” ) ;5 // 11 , 21 , 101

25 / 61

Paradigms Pure Rec Delegates Lambdas Closures More Quiz JS Java

Delegates – visualisation

• three pointers to functions (delegates)

1 Func<int , int> f 1 = o1 . F ;2 Func<int , int> f 2 = o2 . F ;3 Func<int , int> g = C . G ;4 W r i t e L i n e ($”{ f 1 ( 1 )} ,{ f 2 ( 1 )} ,{ g ( 1 )} ” ) ; //11 ,21 ,101

• visualise their target objects

1 f 1 . Target . Dump( ” f 1 ” ) ;23 f 2 . Target . Dump( ” f 2 ” ) ;45 g . Target . Dump( ”g” ) ;

26 / 61

Paradigms Pure Rec Delegates Lambdas Closures More Quiz JS Java

Delegates – visualisation

• three pointers to functions (delegates)

1 Func<int , int> f 1 = o1 . F ;2 Func<int , int> f 2 = o2 . F ;3 Func<int , int> g = C . G ;4 W r i t e L i n e ($”{ f 1 ( 1 )} ,{ f 2 ( 1 )} ,{ g ( 1 )} ” ) ; //11 ,21 ,101

• visualise their target objects

1 f 1 . Target . Dump( ” f 1 ” ) ;23 f 2 . Target . Dump( ” f 2 ” ) ;45 g . Target . Dump( ”g” ) ;

26 / 61

Paradigms Pure Rec Delegates Lambdas Closures More Quiz JS Java

Outline

1 Programming paradigms

2 Pure FP

3 Recursion

4 C# Delegates

5 Lambda expressions

6 Closures

7 More Lambdas

8 Quiz – Simple scenarios

9 Lambdas in Javascript

10 Lambdas in Java

27 / 61

Paradigms Pure Rec Delegates Lambdas Closures More Quiz JS Java

λ-expressions

• Ideas originate from an early theoretical model: λ-calculus(introduced by Alonzo Church, 1930s).

• λ-expression example (lambda in red):

1 l e t f := (λs.suv)

• Let f is “syntactic sugar”, our external denotation to ananonymous (unnamed) λ-expression of one parameter, s.

• Sample invocation: (f x) = ((λs.suv) x) = xuv .

• Pure λ-expressions have only names for the parameters –although these could also be eliminated and replaced bynumbers which indicate the position (De Brujin).

28 / 61

Paradigms Pure Rec Delegates Lambdas Closures More Quiz JS Java

λ-expressions

• Pure λ-calculus has NO variables, NO loops/recursion (butthese can simulated by way of Y combinators).

• Still, λ-calculus is an universal model of computationequivalent to Turing machines!

• Historical note: why “lambdas”? “Raging” debate...

• Church’s manuscript used hats to designate parameters

1 ( s . t )

• Typographer’s solution

1 (ˆ s . t )

• Adjustment (according to the original cursive script)

1 (λs . t )

29 / 61

Paradigms Pure Rec Delegates Lambdas Closures More Quiz JS Java

λ-expressions

• Pure λ-calculus has NO variables, NO loops/recursion (butthese can simulated by way of Y combinators).

• Still, λ-calculus is an universal model of computationequivalent to Turing machines!

• Historical note: why “lambdas”? “Raging” debate...

• Church’s manuscript used hats to designate parameters

1 ( s . t )

• Typographer’s solution

1 (ˆ s . t )

• Adjustment (according to the original cursive script)

1 (λs . t )

29 / 61

Paradigms Pure Rec Delegates Lambdas Closures More Quiz JS Java

Lambdas as anonymous inline functions

• C# examples:

1 Func<s t r ing , int> f = (string s) => s.Length ;

2

3 Func<s t r ing , int> f = s => s.Length ;

• f is a delegate (pointer) to an anonymous (unnamed)function of one string parameter, s, return its length

• sample invocation: f(”abc”)

• F# examples:

1 l e t f = fun (s: string) − > s.Length ;

2

3 l e t f ’ : s t r i ng −> i n t = fun s − > s.Length

30 / 61

Paradigms Pure Rec Delegates Lambdas Closures More Quiz JS Java

Lambdas as anonymous inline functions

• C# examples:

1 Func<s t r ing , int> f = (string s) => s.Length ;

2

3 Func<s t r ing , int> f = s => s.Length ;

• f is a delegate (pointer) to an anonymous (unnamed)function of one string parameter, s, return its length

• sample invocation: f(”abc”)

• F# examples:

1 l e t f = fun (s: string) − > s.Length ;

2

3 l e t f ’ : s t r i ng −> i n t = fun s − > s.Length

30 / 61

Paradigms Pure Rec Delegates Lambdas Closures More Quiz JS Java

Lambdas — Other examples

• C#, F#

1 Func<int> g = () => 2 ; // C#2 l e t g = fun () − > 2 ; // F# un i t −> i n t

• g is a function without parameters, returning int constant 2

• unit is the F# “void” type, with one single value ()

• sample invocation: g()

• C#, F#

1 Func<int , int , int> h = (x, y) => x + y ; // C#2 l e t h = fun (x, y)− > x + y ; // F# ( i n t ∗ i n t ) −> i n t

• h is a function of an int pair, x , y , returning their sum

• sample invocation: h(10, 20)

31 / 61

Paradigms Pure Rec Delegates Lambdas Closures More Quiz JS Java

Lambdas — Other examples

• C#, F#

1 Func<int> g = () => 2 ; // C#2 l e t g = fun () − > 2 ; // F# un i t −> i n t

• g is a function without parameters, returning int constant 2

• unit is the F# “void” type, with one single value ()

• sample invocation: g()

• C#, F#

1 Func<int , int , int> h = (x, y) => x + y ; // C#2 l e t h = fun (x, y)− > x + y ; // F# ( i n t ∗ i n t ) −> i n t

• h is a function of an int pair, x , y , returning their sum

• sample invocation: h(10, 20)

31 / 61

Paradigms Pure Rec Delegates Lambdas Closures More Quiz JS Java

Lambdas — Other examples

• C#, F#

1 Func<int> g = () => 2 ; // C#2 l e t g = fun () − > 2 ; // F# un i t −> i n t

• g is a function without parameters, returning int constant 2

• unit is the F# “void” type, with one single value ()

• sample invocation: g()

• C#, F#

1 Func<int , int , int> h = (x, y) => x + y ; // C#2 l e t h = fun (x, y)− > x + y ; // F# ( i n t ∗ i n t ) −> i n t

• h is a function of an int pair, x , y , returning their sum

• sample invocation: h(10, 20)

31 / 61

Paradigms Pure Rec Delegates Lambdas Closures More Quiz JS Java

Lambdas — Other examples

• C#, F#

1 Func<int> g = () => 2 ; // C#2 l e t g = fun () − > 2 ; // F# un i t −> i n t

• g is a function without parameters, returning int constant 2

• unit is the F# “void” type, with one single value ()

• sample invocation: g()

• C#, F#

1 Func<int , int , int> h = (x, y) => x + y ; // C#2 l e t h = fun (x, y)− > x + y ; // F# ( i n t ∗ i n t ) −> i n t

• h is a function of an int pair, x , y , returning their sum

• sample invocation: h(10, 20)

31 / 61

Paradigms Pure Rec Delegates Lambdas Closures More Quiz JS Java

Lambdas — Other examples

• C#, F#

1 Func<int> g = () => 2 ; // C#2 l e t g = fun () − > 2 ; // F# un i t −> i n t

• g is a function without parameters, returning int constant 2

• unit is the F# “void” type, with one single value ()

• sample invocation: g()

• C#, F#

1 Func<int , int , int> h = (x, y) => x + y ; // C#2 l e t h = fun (x, y)− > x + y ; // F# ( i n t ∗ i n t ) −> i n t

• h is a function of an int pair, x , y , returning their sum

• sample invocation: h(10, 20)

31 / 61

Paradigms Pure Rec Delegates Lambdas Closures More Quiz JS Java

Lambdas — Other examples

• C#, F#

1 Func<int> g = () => 2 ; // C#2 l e t g = fun () − > 2 ; // F# un i t −> i n t

• g is a function without parameters, returning int constant 2

• unit is the F# “void” type, with one single value ()

• sample invocation: g()

• C#, F#

1 Func<int , int , int> h = (x, y) => x + y ; // C#2 l e t h = fun (x, y)− > x + y ; // F# ( i n t ∗ i n t ) −> i n t

• h is a function of an int pair, x , y , returning their sum

• sample invocation: h(10, 20)

31 / 61

Paradigms Pure Rec Delegates Lambdas Closures More Quiz JS Java

Lambdas — Other examples

• C#, F#

1 Func<int> g = () => 2 ; // C#2 l e t g = fun () − > 2 ; // F# un i t −> i n t

• g is a function without parameters, returning int constant 2

• unit is the F# “void” type, with one single value ()

• sample invocation: g()

• C#, F#

1 Func<int , int , int> h = (x, y) => x + y ; // C#2 l e t h = fun (x, y)− > x + y ; // F# ( i n t ∗ i n t ) −> i n t

• h is a function of an int pair, x , y , returning their sum

• sample invocation: h(10, 20)

31 / 61

Paradigms Pure Rec Delegates Lambdas Closures More Quiz JS Java

Lambdas have two faces!

Janus, from Wikipedia

1 Anonymous inline functions

2 Expression trees

32 / 61

Paradigms Pure Rec Delegates Lambdas Closures More Quiz JS Java

Lambdas have two faces!

Janus, from Wikipedia

1 Anonymous inline functions

2 Expression trees

32 / 61

Paradigms Pure Rec Delegates Lambdas Closures More Quiz JS Java

Lambdas as Expression trees!

• The other face of lambdas (≈ compilation arrested atintermediate tree structures)

• Consider the following scenario, where the same lambda canbe assigned to different left-handside type!

1 Func<int , int> g = x => x + 2 ;

2

3 E x p r e s s i o n<Func<int , int>> t = x => x + 2 ;

• g is a pointer to a .NET function int → int

• t is a tree structure, called Expression, representing such afunction

• This tree structure is similar to the intermediate tree structureused by the compiler, when compiling g

33 / 61

Paradigms Pure Rec Delegates Lambdas Closures More Quiz JS Java

Lambdas as Expression trees!

• The other face of lambdas (≈ compilation arrested atintermediate tree structures)

• Consider the following scenario, where the same lambda canbe assigned to different left-handside type!

1 Func<int , int> g = x => x + 2 ;

2

3 E x p r e s s i o n<Func<int , int>> t = x => x + 2 ;

• g is a pointer to a .NET function int → int

• t is a tree structure, called Expression, representing such afunction

• This tree structure is similar to the intermediate tree structureused by the compiler, when compiling g

33 / 61

Paradigms Pure Rec Delegates Lambdas Closures More Quiz JS Java

Lambdas as Expression trees!

• The other face of lambdas (≈ compilation arrested atintermediate tree structures)

• Consider the following scenario, where the same lambda canbe assigned to different left-handside type!

1 Func<int , int> g = x => x + 2 ;

2

3 E x p r e s s i o n<Func<int , int>> t = x => x + 2 ;

• g is a pointer to a .NET function int → int

• t is a tree structure, called Expression, representing such afunction

• This tree structure is similar to the intermediate tree structureused by the compiler, when compiling g

33 / 61

Paradigms Pure Rec Delegates Lambdas Closures More Quiz JS Java

Lambdas as Expression trees!

• The other face of lambdas (≈ compilation arrested atintermediate tree structures)

• Consider the following scenario, where the same lambda canbe assigned to different left-handside type!

1 Func<int , int> g = x => x + 2 ;

2

3 E x p r e s s i o n<Func<int , int>> t = x => x + 2 ;

• g is a pointer to a .NET function int → int

• t is a tree structure, called Expression, representing such afunction

• This tree structure is similar to the intermediate tree structureused by the compiler, when compiling g

33 / 61

Paradigms Pure Rec Delegates Lambdas Closures More Quiz JS Java

Lambdas as Expression trees!

• The other face of lambdas (≈ compilation arrested atintermediate tree structures)

• Consider the following scenario, where the same lambda canbe assigned to different left-handside type!

1 Func<int , int> g = x => x + 2 ;

2

3 E x p r e s s i o n<Func<int , int>> t = x => x + 2 ;

• g is a pointer to a .NET function int → int

• t is a tree structure, called Expression, representing such afunction

• This tree structure is similar to the intermediate tree structureused by the compiler, when compiling g

33 / 61

Paradigms Pure Rec Delegates Lambdas Closures More Quiz JS Java

Lambdas as Expression Trees!

• t can be easily visualised via Linqpad’s Dump() operator

1 t . Dump ( . . . ) ;

Lambda

Func<int,int>

Parameter

x int

Expression

Add int

Parameter

x int

Constant

2 int

parameters body

left right

34 / 61

Paradigms Pure Rec Delegates Lambdas Closures More Quiz JS Java

Sidebar: Typical translation/compilation steps (simplified)

• Source code expression: (x + y) ∗ z

• Abstract syntax tree (AST)

*

+ z

yx

• Target code

• Reverse Polish (postorder): xy+z∗ or stack machine:

1 PUSH x ; PUSH y ; ADD; PUSH z ; MULT; POP

• Bytecode or machine code

1 LOAD x ; ADD y ; MULT z ;

• Almost any other target: SQL, ODATA/REST, ...35 / 61

Paradigms Pure Rec Delegates Lambdas Closures More Quiz JS Java

Sidebar: Typical translation/compilation steps (simplified)

• Source code expression: (x + y) ∗ z

• Abstract syntax tree (AST)

*

+ z

yx

• Target code

• Reverse Polish (postorder): xy+z∗ or stack machine:

1 PUSH x ; PUSH y ; ADD; PUSH z ; MULT; POP

• Bytecode or machine code

1 LOAD x ; ADD y ; MULT z ;

• Almost any other target: SQL, ODATA/REST, ...35 / 61

Paradigms Pure Rec Delegates Lambdas Closures More Quiz JS Java

Sidebar: Typical translation/compilation steps (simplified)

• Source code expression: (x + y) ∗ z

• Abstract syntax tree (AST)

*

+ z

yx

• Target code

• Reverse Polish (postorder): xy+z∗ or stack machine:

1 PUSH x ; PUSH y ; ADD; PUSH z ; MULT; POP

• Bytecode or machine code

1 LOAD x ; ADD y ; MULT z ;

• Almost any other target: SQL, ODATA/REST, ...35 / 61

Paradigms Pure Rec Delegates Lambdas Closures More Quiz JS Java

Sidebar: Typical translation/compilation steps (simplified)

• Source code expression: (x + y) ∗ z

• Abstract syntax tree (AST)

*

+ z

yx

• Target code

• Reverse Polish (postorder): xy+z∗ or stack machine:

1 PUSH x ; PUSH y ; ADD; PUSH z ; MULT; POP

• Bytecode or machine code

1 LOAD x ; ADD y ; MULT z ;

• Almost any other target: SQL, ODATA/REST, ...35 / 61

Paradigms Pure Rec Delegates Lambdas Closures More Quiz JS Java

Sidebar: Typical translation/compilation steps (simplified)

• Source code expression: (x + y) ∗ z

• Abstract syntax tree (AST)

*

+ z

yx

• Target code

• Reverse Polish (postorder): xy+z∗ or stack machine:

1 PUSH x ; PUSH y ; ADD; PUSH z ; MULT; POP

• Bytecode or machine code

1 LOAD x ; ADD y ; MULT z ;

• Almost any other target: SQL, ODATA/REST, ...35 / 61

Paradigms Pure Rec Delegates Lambdas Closures More Quiz JS Java

Sidebar: Typical translation/compilation steps (simplified)

• Source code expression: (x + y) ∗ z

• Abstract syntax tree (AST)

*

+ z

yx

• Target code

• Reverse Polish (postorder): xy+z∗ or stack machine:

1 PUSH x ; PUSH y ; ADD; PUSH z ; MULT; POP

• Bytecode or machine code

1 LOAD x ; ADD y ; MULT z ;

• Almost any other target: SQL, ODATA/REST, ...35 / 61

Paradigms Pure Rec Delegates Lambdas Closures More Quiz JS Java

Lambdas as Expression Trees!

• Consider

1 E x p r e s s i o n<Func<int , int>> t = x => x + 2 ;

• t can be dynamically compiled (at runtime) into a .NETfunction int → int and subsequently executed

1 g = t . Compi le ( ) ;2 var b = g ( 1 0 0 ) ;

• According to the context, providers can compile t to manydifferent other formats, e.g. SQL queries, ODATA queries, ...(more later)

• Hot trend, generalised by the compiler as service

36 / 61

Paradigms Pure Rec Delegates Lambdas Closures More Quiz JS Java

Lambdas as Expression Trees!

• Consider

1 E x p r e s s i o n<Func<int , int>> t = x => x + 2 ;

• t can be dynamically compiled (at runtime) into a .NETfunction int → int and subsequently executed

1 g = t . Compi le ( ) ;2 var b = g ( 1 0 0 ) ;

• According to the context, providers can compile t to manydifferent other formats, e.g. SQL queries, ODATA queries, ...(more later)

• Hot trend, generalised by the compiler as service

36 / 61

Paradigms Pure Rec Delegates Lambdas Closures More Quiz JS Java

Lambdas as Expression Trees!

• Consider

1 E x p r e s s i o n<Func<int , int>> t = x => x + 2 ;

• t can be dynamically compiled (at runtime) into a .NETfunction int → int and subsequently executed

1 g = t . Compi le ( ) ;2 var b = g ( 1 0 0 ) ;

• According to the context, providers can compile t to manydifferent other formats, e.g. SQL queries, ODATA queries, ...(more later)

• Hot trend, generalised by the compiler as service

36 / 61

Paradigms Pure Rec Delegates Lambdas Closures More Quiz JS Java

Lambdas as Expression Trees!

• Consider

1 E x p r e s s i o n<Func<int , int>> t = x => x + 2 ;

• t can be dynamically compiled (at runtime) into a .NETfunction int → int and subsequently executed

1 g = t . Compi le ( ) ;2 var b = g ( 1 0 0 ) ;

• According to the context, providers can compile t to manydifferent other formats, e.g. SQL queries, ODATA queries, ...(more later)

• Hot trend, generalised by the compiler as service

36 / 61

Paradigms Pure Rec Delegates Lambdas Closures More Quiz JS Java

Outline

1 Programming paradigms

2 Pure FP

3 Recursion

4 C# Delegates

5 Lambda expressions

6 Closures

7 More Lambdas

8 Quiz – Simple scenarios

9 Lambdas in Javascript

10 Lambdas in Java

37 / 61

Paradigms Pure Rec Delegates Lambdas Closures More Quiz JS Java

A lambda with a free variable

1 Func<int , int> f = y => y + z ;

• f is a function of one parameter, y , returning the value y + z

• where z is a free variable (external value, expected from thelexical context)

• the closure of f ≡ f plus z

Closure

The closure of a function is the function itself plus contextreferences for all its free variables.

38 / 61

Paradigms Pure Rec Delegates Lambdas Closures More Quiz JS Java

A lambda with a free variable

1 Func<int , int> f = y => y + z ;

• f is a function of one parameter, y , returning the value y + z

• where z is a free variable (external value, expected from thelexical context)

• the closure of f ≡ f plus z

Closure

The closure of a function is the function itself plus contextreferences for all its free variables.

38 / 61

Paradigms Pure Rec Delegates Lambdas Closures More Quiz JS Java

A lambda with a free variable

1 Func<int , int> f = y => y + z ;

• f is a function of one parameter, y , returning the value y + z

• where z is a free variable (external value, expected from thelexical context)

• the closure of f ≡ f plus z

Closure

The closure of a function is the function itself plus contextreferences for all its free variables.

38 / 61

Paradigms Pure Rec Delegates Lambdas Closures More Quiz JS Java

A lambda with a free variable

1 Func<int , int> f = y => y + z ;

• f is a function of one parameter, y , returning the value y + z

• where z is a free variable (external value, expected from thelexical context)

• the closure of f ≡ f plus z

Closure

The closure of a function is the function itself plus contextreferences for all its free variables.

38 / 61

Paradigms Pure Rec Delegates Lambdas Closures More Quiz JS Java

A lambda with a free variable

1 Func<int , int> f = y => y + z ;

• f is a function of one parameter, y , returning the value y + z

• where z is a free variable (external value, expected from thelexical context)

• the closure of f ≡ f plus z

Closure

The closure of a function is the function itself plus contextreferences for all its free variables.

38 / 61

Paradigms Pure Rec Delegates Lambdas Closures More Quiz JS Java

The closure object

1 Func<int , int> f = ( i n t y ) => y + z ;

In C#, closures are implemented as hidden, compiler-generatedclosure objects, where

• anonymous functions, e.g. ( int y) => y + z , are methods

• free variables, e.g. z, are transformed into fields

1 c l a s s Q { // Q and f are hidden compiler-generated names2 pub l i c i n t z ;3 pub l i c i n t f ( i n t y ) { return y + z ; }4 }

Other implementations exist, but this one is “natural” in OOlanguages (C#, Java) and clarifies “tricky” scenarios

39 / 61

Paradigms Pure Rec Delegates Lambdas Closures More Quiz JS Java

The closure object

1 Func<int , int> f = ( i n t y ) => y + z ;

In C#, closures are implemented as hidden, compiler-generatedclosure objects, where

• anonymous functions, e.g. ( int y) => y + z , are methods

• free variables, e.g. z, are transformed into fields

1 c l a s s Q { // Q and f are hidden compiler-generated names2 pub l i c i n t z ;3 pub l i c i n t f ( i n t y ) { return y + z ; }4 }

Other implementations exist, but this one is “natural” in OOlanguages (C#, Java) and clarifies “tricky” scenarios

39 / 61

Paradigms Pure Rec Delegates Lambdas Closures More Quiz JS Java

The closure object

1 Func<int , int> f = ( i n t y ) => y + z ;

In C#, closures are implemented as hidden, compiler-generatedclosure objects, where

• anonymous functions, e.g. ( int y) => y + z , are methods

• free variables, e.g. z, are transformed into fields

1 c l a s s Q { // Q and f are hidden compiler-generated names2 pub l i c i n t z ;3 pub l i c i n t f ( i n t y ) { return y + z ; }4 }

Other implementations exist, but this one is “natural” in OOlanguages (C#, Java) and clarifies “tricky” scenarios

39 / 61

Paradigms Pure Rec Delegates Lambdas Closures More Quiz JS Java

The closure object

1 Func<int , int> f = ( i n t y ) => y + z ;

In C#, closures are implemented as hidden, compiler-generatedclosure objects, where

• anonymous functions, e.g. ( int y) => y + z , are methods

• free variables, e.g. z, are transformed into fields

1 c l a s s Q { // Q and f are hidden compiler-generated names2 pub l i c i n t z ;3 pub l i c i n t f ( i n t y ) { return y + z ; }4 }

Other implementations exist, but this one is “natural” in OOlanguages (C#, Java) and clarifies “tricky” scenarios

39 / 61

Paradigms Pure Rec Delegates Lambdas Closures More Quiz JS Java

The closure object

1 Func<int , int> f = ( i n t y ) => y + z ;

In C#, closures are implemented as hidden, compiler-generatedclosure objects, where

• anonymous functions, e.g. ( int y) => y + z , are methods

• free variables, e.g. z, are transformed into fields

1 c l a s s Q { // Q and f are hidden compiler-generated names2 pub l i c i n t z ;3 pub l i c i n t f ( i n t y ) { return y + z ; }4 }

Other implementations exist, but this one is “natural” in OOlanguages (C#, Java) and clarifies “tricky” scenarios

39 / 61

Paradigms Pure Rec Delegates Lambdas Closures More Quiz JS Java

The closure object

1 Func<int , int> f = ( i n t y ) => y + z ;

In C#, closures are implemented as hidden, compiler-generatedclosure objects, where

• anonymous functions, e.g. ( int y) => y + z , are methods

• free variables, e.g. z, are transformed into fields

1 c l a s s Q { // Q and f are hidden compiler-generated names2 pub l i c i n t z ;3 pub l i c i n t f ( i n t y ) { return y + z ; }4 }

Other implementations exist, but this one is “natural” in OOlanguages (C#, Java) and clarifies “tricky” scenarios

39 / 61

Paradigms Pure Rec Delegates Lambdas Closures More Quiz JS Java

The closure object

• Closures in FP often serve a similar purpose as objects in OO.Essentially, the following two objects are equivalent:

• The hidden closure object created by the following FP snippet:

1 var x = 1 0 ;2 var y = 2 0 ;3 Func<int> f = ( ) => x + y ;4 Func<int> g = ( ) => x ∗ x ;

• An instance of the following OO class:

1 c l a s s C {2 pub l i c i n t x = 1 0 ;3 pub l i c i n t y = 2 0 ;4 pub l i c i n t f ( ) { return x + y ; }5 pub l i c i n t g ( ) { return x ∗ x ; }6 }

40 / 61

Paradigms Pure Rec Delegates Lambdas Closures More Quiz JS Java

The closure object

• Closures in FP often serve a similar purpose as objects in OO.Essentially, the following two objects are equivalent:

• The hidden closure object created by the following FP snippet:

1 var x = 1 0 ;2 var y = 2 0 ;3 Func<int> f = ( ) => x + y ;4 Func<int> g = ( ) => x ∗ x ;

• An instance of the following OO class:

1 c l a s s C {2 pub l i c i n t x = 1 0 ;3 pub l i c i n t y = 2 0 ;4 pub l i c i n t f ( ) { return x + y ; }5 pub l i c i n t g ( ) { return x ∗ x ; }6 }

40 / 61

Paradigms Pure Rec Delegates Lambdas Closures More Quiz JS Java

The closure object

• Closures in FP often serve a similar purpose as objects in OO.Essentially, the following two objects are equivalent:

• The hidden closure object created by the following FP snippet:

1 var x = 1 0 ;2 var y = 2 0 ;3 Func<int> f = ( ) => x + y ;4 Func<int> g = ( ) => x ∗ x ;

• An instance of the following OO class:

1 c l a s s C {2 pub l i c i n t x = 1 0 ;3 pub l i c i n t y = 2 0 ;4 pub l i c i n t f ( ) { return x + y ; }5 pub l i c i n t g ( ) { return x ∗ x ; }6 }

40 / 61

Paradigms Pure Rec Delegates Lambdas Closures More Quiz JS Java

Targets and Closures – visualisation

To visualise the target of a delegate to a lambda, consider thefollowing scenario (Linqpad)

1 Func<int , int> f = v => v + 1 ;2 i n t x = 1 0 ;3 Func<int , int> g = v => v + x ; // closure!4 W r i t e L i n e ($”{ f ( 1 0 )} , {g ( 1 0 )} ” ) ; // 11 , 2056 f . Target . Dump( ” f ” ) ;7 g . Target . Dump( ”g” ) ;

<>c DisplayClass5 is the in-ternal name of the automati-cally generated closure class

41 / 61

Paradigms Pure Rec Delegates Lambdas Closures More Quiz JS Java

Dynamic access to closure details – C#

• Consider the following function Quiz. Quiz returns a closure,which includes the field w

1 Func<int , int> Quiz ( i n t z ) {2 i n t w = z + 1 ;3 return y => w + y ;4 }

• Consider a scenario where we dynamically update the field wof a closure generated by Quiz

1 Func<int , int> k2 = Quiz ( 2 0 0 ) ; // . w = 2012 i n t i 2 = k2 ( 1 0 ) ; // 21134 dynamic t = k2 . Target ; // duck t y p i n g as in JS !5 t .w += 1 ;6 i n t i 3 = k2 ( 1 0 ) ; // 212

42 / 61

Paradigms Pure Rec Delegates Lambdas Closures More Quiz JS Java

Dynamic access to closure details – C#

43 / 61

Paradigms Pure Rec Delegates Lambdas Closures More Quiz JS Java

Outline

1 Programming paradigms

2 Pure FP

3 Recursion

4 C# Delegates

5 Lambda expressions

6 Closures

7 More Lambdas

8 Quiz – Simple scenarios

9 Lambdas in Javascript

10 Lambdas in Java

44 / 61

Paradigms Pure Rec Delegates Lambdas Closures More Quiz JS Java

A lambda taking another lambda

1 Func<Func<int , int >, int , int> h = (f , x) => f (x) ;

• h is a function of two parameters:a function Func<int, int> f and an int x ,

• which returns the result of f on x , i.e. f (x)

• sample invocation: h(n => n+n, 10)

• sample invocation: h(n => n∗n, 10)

45 / 61

Paradigms Pure Rec Delegates Lambdas Closures More Quiz JS Java

A lambda taking another lambda

1 Func<Func<int , int >, int , int> h = (f , x) => f (x) ;

• h is a function of two parameters:a function Func<int, int> f and an int x ,

• which returns the result of f on x , i.e. f (x)

• sample invocation: h(n => n+n, 10)

• sample invocation: h(n => n∗n, 10)

45 / 61

Paradigms Pure Rec Delegates Lambdas Closures More Quiz JS Java

A lambda taking another lambda

1 Func<Func<int , int >, int , int> h = (f , x) => f (x) ;

• h is a function of two parameters:a function Func<int, int> f and an int x ,

• which returns the result of f on x , i.e. f (x)

• sample invocation: h(n => n+n, 10)

• sample invocation: h(n => n∗n, 10)

45 / 61

Paradigms Pure Rec Delegates Lambdas Closures More Quiz JS Java

A lambda taking another lambda

1 Func<Func<int , int >, int , int> h = (f , x) => f (x) ;

• h is a function of two parameters:a function Func<int, int> f and an int x ,

• which returns the result of f on x , i.e. f (x)

• sample invocation: h(n => n+n, 10)

• sample invocation: h(n => n∗n, 10)

45 / 61

Paradigms Pure Rec Delegates Lambdas Closures More Quiz JS Java

A lambda taking another lambda

1 Func<Func<int , int >, int , int> h = (f , x) => f (x) ;

• h is a function of two parameters:a function Func<int, int> f and an int x ,

• which returns the result of f on x , i.e. f (x)

• sample invocation: h(n => n+n, 10)

• sample invocation: h(n => n∗n, 10)

45 / 61

Paradigms Pure Rec Delegates Lambdas Closures More Quiz JS Java

A lambda returning another lambda

1 Func<int , Func<int , int>> h = x => (y => x + y) ;

• h is a function of one int parameter, x

• which returns an anonymous Func<int, int> function, of oneint parameter, y

• sample invocation: var r = h(10)(20)

• h is similar, but not identical, to the function h of twovariables from the preceding slide

• another invocation:

1 Func<int , int> k = h(10) ; var r = k ( 3 0 ) ;

2 which is equivalent to

3 Func<int , int> k = (y => 10 + y) ; var r = k ( 3 0 ) ;

46 / 61

Paradigms Pure Rec Delegates Lambdas Closures More Quiz JS Java

A lambda returning another lambda

1 Func<int , Func<int , int>> h = x => (y => x + y) ;

• h is a function of one int parameter, x

• which returns an anonymous Func<int, int> function, of oneint parameter, y

• sample invocation: var r = h(10)(20)

• h is similar, but not identical, to the function h of twovariables from the preceding slide

• another invocation:

1 Func<int , int> k = h(10) ; var r = k ( 3 0 ) ;

2 which is equivalent to

3 Func<int , int> k = (y => 10 + y) ; var r = k ( 3 0 ) ;

46 / 61

Paradigms Pure Rec Delegates Lambdas Closures More Quiz JS Java

A lambda returning another lambda

1 Func<int , Func<int , int>> h = x => (y => x + y) ;

• h is a function of one int parameter, x

• which returns an anonymous Func<int, int> function, of oneint parameter, y

• sample invocation: var r = h(10)(20)

• h is similar, but not identical, to the function h of twovariables from the preceding slide

• another invocation:

1 Func<int , int> k = h(10) ; var r = k ( 3 0 ) ;

2 which is equivalent to

3 Func<int , int> k = (y => 10 + y) ; var r = k ( 3 0 ) ;

46 / 61

Paradigms Pure Rec Delegates Lambdas Closures More Quiz JS Java

A lambda returning another lambda

1 Func<int , Func<int , int>> h = x => (y => x + y) ;

• h is a function of one int parameter, x

• which returns an anonymous Func<int, int> function, of oneint parameter, y

• sample invocation: var r = h(10)(20)

• h is similar, but not identical, to the function h of twovariables from the preceding slide

• another invocation:

1 Func<int , int> k = h(10) ; var r = k ( 3 0 ) ;

2 which is equivalent to

3 Func<int , int> k = (y => 10 + y) ; var r = k ( 3 0 ) ;

46 / 61

Paradigms Pure Rec Delegates Lambdas Closures More Quiz JS Java

A lambda returning another lambda

1 Func<int , Func<int , int>> h = x => (y => x + y) ;

• h is a function of one int parameter, x

• which returns an anonymous Func<int, int> function, of oneint parameter, y

• sample invocation: var r = h(10)(20)

• h is similar, but not identical, to the function h of twovariables from the preceding slide

• another invocation:

1 Func<int , int> k = h(10) ; var r = k ( 3 0 ) ;

2 which is equivalent to

3 Func<int , int> k = (y => 10 + y) ; var r = k ( 3 0 ) ;

46 / 61

Paradigms Pure Rec Delegates Lambdas Closures More Quiz JS Java

A lambda returning another lambda

1 Func<int , Func<int , int>> h = x => (y => x + y) ;

• h is a function of one int parameter, x

• which returns an anonymous Func<int, int> function, of oneint parameter, y

• sample invocation: var r = h(10)(20)

• h is similar, but not identical, to the function h of twovariables from the preceding slide

• another invocation:

1 Func<int , int> k = h(10) ; var r = k ( 3 0 ) ;

2 which is equivalent to

3 Func<int , int> k = (y => 10 + y) ; var r = k ( 3 0 ) ;

46 / 61

Paradigms Pure Rec Delegates Lambdas Closures More Quiz JS Java

Expression lambdas and statement lambdas

Two kind of lambdas (so far we’ve seen only the first type):

• expression lambdas

param => expr or (params) => expr

• statement lambdasparam => {stmt} or (params) => {stmt}

• Any expression lambda can be converted to a statement

lambda, e.g. param => expr → param => {return expr ; }

• Currently, only expression lambdas can be viewed as syntaxtrees (assigned to Expressions)

47 / 61

Paradigms Pure Rec Delegates Lambdas Closures More Quiz JS Java

Expression lambdas and statement lambdas

Two kind of lambdas (so far we’ve seen only the first type):

• expression lambdas

param => expr or (params) => expr

• statement lambdasparam => {stmt} or (params) => {stmt}

• Any expression lambda can be converted to a statement

lambda, e.g. param => expr → param => {return expr ; }

• Currently, only expression lambdas can be viewed as syntaxtrees (assigned to Expressions)

47 / 61

Paradigms Pure Rec Delegates Lambdas Closures More Quiz JS Java

Expression lambdas and statement lambdas

Two kind of lambdas (so far we’ve seen only the first type):

• expression lambdas

param => expr or (params) => expr

• statement lambdasparam => {stmt} or (params) => {stmt}

• Any expression lambda can be converted to a statement

lambda, e.g. param => expr → param => {return expr ; }

• Currently, only expression lambdas can be viewed as syntaxtrees (assigned to Expressions)

47 / 61

Paradigms Pure Rec Delegates Lambdas Closures More Quiz JS Java

Expression lambdas and statement lambdas

Two kind of lambdas (so far we’ve seen only the first type):

• expression lambdas

param => expr or (params) => expr

• statement lambdasparam => {stmt} or (params) => {stmt}

• Any expression lambda can be converted to a statement

lambda, e.g. param => expr → param => {return expr ; }

• Currently, only expression lambdas can be viewed as syntaxtrees (assigned to Expressions)

47 / 61

Paradigms Pure Rec Delegates Lambdas Closures More Quiz JS Java

Expression lambdas and statement lambdas

Two kind of lambdas (so far we’ve seen only the first type):

• expression lambdas

param => expr or (params) => expr

• statement lambdasparam => {stmt} or (params) => {stmt}

• Any expression lambda can be converted to a statement

lambda, e.g. param => expr → param => {return expr ; }

• Currently, only expression lambdas can be viewed as syntaxtrees (assigned to Expressions)

47 / 61

Paradigms Pure Rec Delegates Lambdas Closures More Quiz JS Java

More examples

The C# compiler uses type inference rules to determine typeswhich are not explicit.

What are the delegate types (i.e. Func<>’s or Action<>’s) of thefollowing lambda expressions?

1 x => x + 123 ( i n t x ) => x + 145 x => { return x +1; }67 ( i n t x ) => { return x +1; }89 ( x , y ) => x ∗ y

1011 ( ) => { C o n s o l e . W r i t e L i n e ( ) ; }

48 / 61

Paradigms Pure Rec Delegates Lambdas Closures More Quiz JS Java

More examples

The C# compiler uses type inference rules to determine typeswhich are not explicit.

What are the delegate types (i.e. Func<>’s or Action<>’s) of thefollowing lambda expressions?

1 x => x + 123 ( i n t x ) => x + 145 x => { return x +1; }67 ( i n t x ) => { return x +1; }89 ( x , y ) => x ∗ y

1011 ( ) => { C o n s o l e . W r i t e L i n e ( ) ; }

48 / 61

Paradigms Pure Rec Delegates Lambdas Closures More Quiz JS Java

Outline

1 Programming paradigms

2 Pure FP

3 Recursion

4 C# Delegates

5 Lambda expressions

6 Closures

7 More Lambdas

8 Quiz – Simple scenarios

9 Lambdas in Javascript

10 Lambdas in Java

49 / 61

Paradigms Pure Rec Delegates Lambdas Closures More Quiz JS Java

Quiz

What are the results?

1 Func<int , int> f = ( x => x + 2 ) ;2 i n t a = f ( 1 0 ) ;

1 Func<int , int , int> g = ( ( x , y ) => x ∗ y ) ;2 i n t b = g ( 1 0 , 2 0 ) ;

50 / 61

Paradigms Pure Rec Delegates Lambdas Closures More Quiz JS Java

Quiz

What are the results?

1 Func<int , int> f = ( x => x + 2 ) ;2 i n t a = f ( 1 0 ) ;

1 Func<int , int , int> g = ( ( x , y ) => x ∗ y ) ;2 i n t b = g ( 1 0 , 2 0 ) ;

50 / 61

Paradigms Pure Rec Delegates Lambdas Closures More Quiz JS Java

Quiz

What are the results?

1 Func<Func<int , int >, int , int>2 f 1 = ( ( k , x ) => 2∗k ( x ) ) ;3 i n t a1 = f 1 ( f , 1 0 ) ;4 i n t b1 = f 1 ( t => t +1, 10)

1 Func<int , Func<int , Func<int , int>>>2 g1 = ( x => ( y => ( z => x + y + z ) ) ) ;3 i n t b1 = g1 ( 1 0 ) ( 2 0 ) ( 3 0 ) ;

51 / 61

Paradigms Pure Rec Delegates Lambdas Closures More Quiz JS Java

Quiz

What are the results?

1 Func<Func<int , int >, int , int>2 f 1 = ( ( k , x ) => 2∗k ( x ) ) ;3 i n t a1 = f 1 ( f , 1 0 ) ;4 i n t b1 = f 1 ( t => t +1, 10)

1 Func<int , Func<int , Func<int , int>>>2 g1 = ( x => ( y => ( z => x + y + z ) ) ) ;3 i n t b1 = g1 ( 1 0 ) ( 2 0 ) ( 3 0 ) ;

51 / 61

Paradigms Pure Rec Delegates Lambdas Closures More Quiz JS Java

Quiz

What are the results?

1 Func<Func<int , int >, int , int>2 f 1 = ( ( k , x ) => 2∗k ( x ) ) ;3 i n t a1 = f 1 ( f , 1 0 ) ;4 i n t b1 = f 1 ( t => t +1, 10)

1 Func<int , Func<int , Func<int , int>>>2 g1 = ( x => ( y => ( z => x + y + z ) ) ) ;3 i n t b1 = g1 ( 1 0 ) ( 2 0 ) ( 3 0 ) ;

51 / 61

Paradigms Pure Rec Delegates Lambdas Closures More Quiz JS Java

Quiz – simple closure

What are the results?

1 i n t z = 1 0 0 ;2 Func<int , int> h = ( y => z + y ) ;3 i n t c = h ( 1 0 ) ;4 z = 2 0 0 ;5 i n t d = h ( 1 0 ) ;

Take care of the free variable z , which is included in the closure

Note that the closure contains the variable z itself (or a pointer toit), not a copy of its value

52 / 61

Paradigms Pure Rec Delegates Lambdas Closures More Quiz JS Java

Quiz – simple closure

What are the results?

1 i n t z = 1 0 0 ;2 Func<int , int> h = ( y => z + y ) ;3 i n t c = h ( 1 0 ) ;4 z = 2 0 0 ;5 i n t d = h ( 1 0 ) ;

Take care of the free variable z , which is included in the closure

Note that the closure contains the variable z itself (or a pointer toit), not a copy of its value

52 / 61

Paradigms Pure Rec Delegates Lambdas Closures More Quiz JS Java

Quiz – simple closure

What are the results?

1 i n t z = 1 0 0 ;2 Func<int , int> h = ( y => z + y ) ;3 i n t c = h ( 1 0 ) ;4 z = 2 0 0 ;5 i n t d = h ( 1 0 ) ;

Take care of the free variable z , which is included in the closure

Note that the closure contains the variable z itself (or a pointer toit), not a copy of its value

52 / 61

Paradigms Pure Rec Delegates Lambdas Closures More Quiz JS Java

Quiz –“tricky” closure

1 Func<int , int> Quiz ( i n t z) {2 . . . // statements here are executed just when Quiz is called3 . . . // this includes the creation of the hidden closure object4 return ( y => z + y ) ; // function returned by Quiz5 }

Take care of parameter z , which is is a free variable, included inthe returned closure.

Here, each call of Quiz creates and returns its own closure object,which uses its own copy of z .

Note also that, like many other similar languages, C# usescall-by-value.

53 / 61

Paradigms Pure Rec Delegates Lambdas Closures More Quiz JS Java

Quiz –“tricky” closure

1 Func<int , int> Quiz ( i n t z) {2 . . . // statements here are executed just when Quiz is called3 . . . // this includes the creation of the hidden closure object4 return ( y => z + y ) ; // function returned by Quiz5 }

Take care of parameter z , which is is a free variable, included inthe returned closure.

Here, each call of Quiz creates and returns its own closure object,which uses its own copy of z .

Note also that, like many other similar languages, C# usescall-by-value.

53 / 61

Paradigms Pure Rec Delegates Lambdas Closures More Quiz JS Java

Quiz –“tricky” closure

1 Func<int , int> Quiz ( i n t z) {2 . . . // statements here are executed just when Quiz is called3 . . . // this includes the creation of the hidden closure object4 return ( y => z + y ) ; // function returned by Quiz5 }

Take care of parameter z , which is is a free variable, included inthe returned closure.

Here, each call of Quiz creates and returns its own closure object,which uses its own copy of z .

Note also that, like many other similar languages, C# usescall-by-value.

53 / 61

Paradigms Pure Rec Delegates Lambdas Closures More Quiz JS Java

Quiz –“tricky” closure

1 Func<int , int> Quiz ( i n t z) {2 . . . // statements here are executed just when Quiz is called3 . . . // this includes the creation of the hidden closure object4 return ( y => z + y ) ; // function returned by Quiz5 }

Take care of parameter z , which is is a free variable, included inthe returned closure.

Here, each call of Quiz creates and returns its own closure object,which uses its own copy of z .

Note also that, like many other similar languages, C# usescall-by-value.

53 / 61

Paradigms Pure Rec Delegates Lambdas Closures More Quiz JS Java

Quiz –“tricky” closure

1 Func<int , int> Quiz ( i n t z) {2 . . . // statements here are executed when Quiz itself is called3 . . . // this includes the creation of the hidden closure object4 return ( y => z + y ) ; // function returned by Quiz5 }

1 Func<int , int> k1 = Quiz ( 1 0 0 ) ; // k1’s z = 1002 Func<int , int> k2 = Quiz ( 2 0 0 ) ; // k2’s z = 2003 i n t i 1 = k1 ( 1 0 ) ;4 i n t i 2 = k2 ( 1 0 ) ;5 i n t i 3 = k1 ( 2 0 ) ;6 i n t i 4 = k2 ( 2 0 ) ;

Each delegate, k1 and k2, has its own closure, with its own copyof z , which will “magically survive”, after the end of Quiz.

54 / 61

Paradigms Pure Rec Delegates Lambdas Closures More Quiz JS Java

Quiz –“tricky” closure

1 Func<int , int> Quiz ( i n t z) {2 . . . // statements here are executed when Quiz itself is called3 . . . // this includes the creation of the hidden closure object4 return ( y => z + y ) ; // function returned by Quiz5 }

1 Func<int , int> k1 = Quiz ( 1 0 0 ) ; // k1’s z = 1002 Func<int , int> k2 = Quiz ( 2 0 0 ) ; // k2’s z = 2003 i n t i 1 = k1 ( 1 0 ) ;4 i n t i 2 = k2 ( 1 0 ) ;5 i n t i 3 = k1 ( 2 0 ) ;6 i n t i 4 = k2 ( 2 0 ) ;

Each delegate, k1 and k2, has its own closure, with its own copyof z , which will “magically survive”, after the end of Quiz.

54 / 61

Paradigms Pure Rec Delegates Lambdas Closures More Quiz JS Java

Quiz –“tricky” closure

1 Func<int , int> Quiz ( i n t z) {2 . . . // statements here are executed when Quiz itself is called3 . . . // this includes the creation of the hidden closure object4 return ( y => z + y ) ; // function returned by Quiz5 }

1 Func<int , int> k1 = Quiz ( 1 0 0 ) ; // k1’s z = 1002 Func<int , int> k2 = Quiz ( 2 0 0 ) ; // k2’s z = 2003 i n t i 1 = k1 ( 1 0 ) ;4 i n t i 2 = k2 ( 1 0 ) ;5 i n t i 3 = k1 ( 2 0 ) ;6 i n t i 4 = k2 ( 2 0 ) ;

Each delegate, k1 and k2, has its own closure, with its own copyof z , which will “magically survive”, after the end of Quiz.

54 / 61

Paradigms Pure Rec Delegates Lambdas Closures More Quiz JS Java

Quiz –“trickier” closure – C#

1 // Func<int , Func<int>>2 Func<int> Quiz ( i n t q ) {3 return ( ) => {4 q = q + 1 ;5 return q ;6 } ;7 }

1 Func<int> k1 = Quiz ( 1 0 0 ) ;2 Func<int> k2 = Quiz ( 2 0 0 ) ;34 C o n s o l e . W r i t e L i n e ( ”{0} {1} {2}” , k1 ( ) , k1 ( ) , k1 ( ) ) ;5 C o n s o l e . W r i t e L i n e ( ”{0} {1} {2}” , k2 ( ) , k2 ( ) , k2 ( ) ) ;6 C o n s o l e . W r i t e L i n e ( ”{0} {1} {2}” , k1 ( ) , k1 ( ) , k1 ( ) ) ;

What are the printed results?55 / 61

Paradigms Pure Rec Delegates Lambdas Closures More Quiz JS Java

Quiz –“trickier” closure – C#

1 // Func<int , Func<int>>2 Func<int> Quiz ( i n t q ) {3 return ( ) => {4 q = q + 1 ;5 return q ;6 } ;7 }

1 Func<int> k1 = Quiz ( 1 0 0 ) ;2 Func<int> k2 = Quiz ( 2 0 0 ) ;34 C o n s o l e . W r i t e L i n e ( ”{0} {1} {2}” , k1 ( ) , k1 ( ) , k1 ( ) ) ;5 C o n s o l e . W r i t e L i n e ( ”{0} {1} {2}” , k2 ( ) , k2 ( ) , k2 ( ) ) ;6 C o n s o l e . W r i t e L i n e ( ”{0} {1} {2}” , k1 ( ) , k1 ( ) , k1 ( ) ) ;

What are the printed results?55 / 61

Paradigms Pure Rec Delegates Lambdas Closures More Quiz JS Java

Quiz –“trickier” closure – C#

1 // Func<int , Func<int>>2 Func<int> Quiz ( i n t q ) {3 return ( ) => {4 q = q + 1 ;5 return q ;6 } ;7 }

1 Func<int> k1 = Quiz ( 1 0 0 ) ;2 Func<int> k2 = Quiz ( 2 0 0 ) ;34 C o n s o l e . W r i t e L i n e ( ”{0} {1} {2}” , k1 ( ) , k1 ( ) , k1 ( ) ) ;5 C o n s o l e . W r i t e L i n e ( ”{0} {1} {2}” , k2 ( ) , k2 ( ) , k2 ( ) ) ;6 C o n s o l e . W r i t e L i n e ( ”{0} {1} {2}” , k1 ( ) , k1 ( ) , k1 ( ) ) ;

What are the printed results?55 / 61

Paradigms Pure Rec Delegates Lambdas Closures More Quiz JS Java

Quiz –“trickier” closure – F#

1 // i n t −> ( un i t −> i n t )2 l e t Quiz q =3 l e t mutable p = q // q is not mutable4 fun ( ) −>5 p <− p + 16 p

1 l e t k1 = Quiz ( 1 0 0 ) // un i t −> i n t2 l e t k2 = Quiz ( 2 0 0 ) // un i t −> i n t34 C o n s o l e . W r i t e L i n e ( ”{0} {1} {2}” , k1 ( ) , k1 ( ) , k1 ( ) )5 C o n s o l e . W r i t e L i n e ( ”{0} {1} {2}” , k2 ( ) , k2 ( ) , k2 ( ) )6 C o n s o l e . W r i t e L i n e ( ”{0} {1} {2}” , k1 ( ) , k1 ( ) , k1 ( ) )

What are the printed results?

56 / 61

Paradigms Pure Rec Delegates Lambdas Closures More Quiz JS Java

Quiz –“trickier” closure – F#

1 // i n t −> ( un i t −> i n t )2 l e t Quiz q =3 l e t mutable p = q // q is not mutable4 fun ( ) −>5 p <− p + 16 p

1 l e t k1 = Quiz ( 1 0 0 ) // un i t −> i n t2 l e t k2 = Quiz ( 2 0 0 ) // un i t −> i n t34 C o n s o l e . W r i t e L i n e ( ”{0} {1} {2}” , k1 ( ) , k1 ( ) , k1 ( ) )5 C o n s o l e . W r i t e L i n e ( ”{0} {1} {2}” , k2 ( ) , k2 ( ) , k2 ( ) )6 C o n s o l e . W r i t e L i n e ( ”{0} {1} {2}” , k1 ( ) , k1 ( ) , k1 ( ) )

What are the printed results?

56 / 61

Paradigms Pure Rec Delegates Lambdas Closures More Quiz JS Java

Quiz –“trickier” closure – F#

1 // i n t −> ( un i t −> i n t )2 l e t Quiz q =3 l e t mutable p = q // q is not mutable4 fun ( ) −>5 p <− p + 16 p

1 l e t k1 = Quiz ( 1 0 0 ) // un i t −> i n t2 l e t k2 = Quiz ( 2 0 0 ) // un i t −> i n t34 C o n s o l e . W r i t e L i n e ( ”{0} {1} {2}” , k1 ( ) , k1 ( ) , k1 ( ) )5 C o n s o l e . W r i t e L i n e ( ”{0} {1} {2}” , k2 ( ) , k2 ( ) , k2 ( ) )6 C o n s o l e . W r i t e L i n e ( ”{0} {1} {2}” , k1 ( ) , k1 ( ) , k1 ( ) )

What are the printed results?

56 / 61

Paradigms Pure Rec Delegates Lambdas Closures More Quiz JS Java

Outline

1 Programming paradigms

2 Pure FP

3 Recursion

4 C# Delegates

5 Lambda expressions

6 Closures

7 More Lambdas

8 Quiz – Simple scenarios

9 Lambdas in Javascript

10 Lambdas in Java

57 / 61

Paradigms Pure Rec Delegates Lambdas Closures More Quiz JS Java

Quiz –“trickier” closure – JS

1 funct ion Quiz ( q ) {2 return ( ) => {3 q = q + 14 return q5 }6 }

1 l e t k1 = Quiz ( 1 0 0 )2 l e t k2 = Quiz ( 2 0 0 )34 c o n s o l e . l o g ( k1 ( ) , k1 ( ) , k1 ( ) )5 c o n s o l e . l o g ( k2 ( ) , k2 ( ) , k2 ( ) )6 c o n s o l e . l o g ( k1 ( ) , k1 ( ) , k1 ( ) )

What are the printed results?

58 / 61

Paradigms Pure Rec Delegates Lambdas Closures More Quiz JS Java

Quiz –“trickier” closure – JS

1 funct ion Quiz ( q ) {2 return ( ) => {3 q = q + 14 return q5 }6 }

1 l e t k1 = Quiz ( 1 0 0 )2 l e t k2 = Quiz ( 2 0 0 )34 c o n s o l e . l o g ( k1 ( ) , k1 ( ) , k1 ( ) )5 c o n s o l e . l o g ( k2 ( ) , k2 ( ) , k2 ( ) )6 c o n s o l e . l o g ( k1 ( ) , k1 ( ) , k1 ( ) )

What are the printed results?

58 / 61

Paradigms Pure Rec Delegates Lambdas Closures More Quiz JS Java

Quiz –“trickier” closure – JS

1 funct ion Quiz ( q ) {2 return ( ) => {3 q = q + 14 return q5 }6 }

1 l e t k1 = Quiz ( 1 0 0 )2 l e t k2 = Quiz ( 2 0 0 )34 c o n s o l e . l o g ( k1 ( ) , k1 ( ) , k1 ( ) )5 c o n s o l e . l o g ( k2 ( ) , k2 ( ) , k2 ( ) )6 c o n s o l e . l o g ( k1 ( ) , k1 ( ) , k1 ( ) )

What are the printed results?

58 / 61

Paradigms Pure Rec Delegates Lambdas Closures More Quiz JS Java

Outline

1 Programming paradigms

2 Pure FP

3 Recursion

4 C# Delegates

5 Lambda expressions

6 Closures

7 More Lambdas

8 Quiz – Simple scenarios

9 Lambdas in Javascript

10 Lambdas in Java

59 / 61

Paradigms Pure Rec Delegates Lambdas Closures More Quiz JS Java

Simple Java lambda – before v8

Source LambdaJava.java

1 i n t e r f a ce BinaryOp {2 i n t op ( i n t x , i n t y ) ;3 }4 c l a s s LambdaJava {5 pub l i c s t a t i c void main ( S t r i n g [ ] a r g s ) {6 BinaryOp add1 = new BinaryOp ( ) {7 pub l i c i n t op ( i n t x , i n t y ) { return x + y ;}8 } ;9 i n t r e s 1 = add1 . op ( 1 0 , 2 0 ) ;

10 System . out . p r i n t l n ( r e s 1 ) ;11 }12 }

60 / 61

Paradigms Pure Rec Delegates Lambdas Closures More Quiz JS Java

Simple Java lambdas – v8

1 @ F u n c t i o n a l I n t e r f a c e // optional annotation – attribute2 i n t e r f a ce BinaryOp {3 i n t op ( i n t x , i n t y ) ;4 }56 c l a s s LambdaJava8 {7 pub l i c s t a t i c void main ( S t r i n g [ ] a r g s ) {8 BinaryOp add2 = ( x , y ) −> x + y ;9 i n t r e s 2 = add2 . op ( 1 0 , 2 0 ) ;

10 System . out . p r i n t l n ( r e s 2 ) ;1112 j a v a . u t i l . funct ion . Funct ion<I n t e g e r , I n t e g e r>13 i n c = x −> x + 1 ; // <Integer , Integer>14 i n t r e s = i n c . a p p l y ( 1 0 ) ;15 System . out . p r i n t l n ( r e s ) ;16 }17 }

61 / 61

Recommended