Functional Interfaces vs. Function Types in Java with Lambdaspl/talks/ATPS_14_slides.pdf · Java...

62
Introduction Functional interfaces vs. function-types Proposal: functional interfaces and function-types Conclusion and Outlook Functional Interfaces vs. Function Types in Java with Lambdas Martin Pl¨ umicke Baden-Wuerttemberg Cooperative State University Stuttgart/Horb 26. February 2014 Martin Pl¨ umicke Functional Interfaces vs. Function Types in Java

Transcript of Functional Interfaces vs. Function Types in Java with Lambdaspl/talks/ATPS_14_slides.pdf · Java...

Page 1: Functional Interfaces vs. Function Types in Java with Lambdaspl/talks/ATPS_14_slides.pdf · Java 8:[Goetz 2013: State of the Lambda]: I Lambdas with functional interfaces as target

IntroductionFunctional interfaces vs. function-types

Proposal: functional interfaces and function-typesConclusion and Outlook

Functional Interfaces vs. Function Types in Java withLambdas

Martin Plumicke

Baden-Wuerttemberg Cooperative State UniversityStuttgart/Horb

26. February 2014

Martin Plumicke Functional Interfaces vs. Function Types in Java

Page 2: Functional Interfaces vs. Function Types in Java with Lambdaspl/talks/ATPS_14_slides.pdf · Java 8:[Goetz 2013: State of the Lambda]: I Lambdas with functional interfaces as target

IntroductionFunctional interfaces vs. function-types

Proposal: functional interfaces and function-typesConclusion and Outlook

Overview

Introduction

Functional interfaces vs. function-typesFunction–typesFunctional interfacesSubtypingEvaluation of lambda expressions

Proposal: functional interfaces and function-types

Conclusion and Outlook

Martin Plumicke Functional Interfaces vs. Function Types in Java

Page 3: Functional Interfaces vs. Function Types in Java with Lambdaspl/talks/ATPS_14_slides.pdf · Java 8:[Goetz 2013: State of the Lambda]: I Lambdas with functional interfaces as target

IntroductionFunctional interfaces vs. function-types

Proposal: functional interfaces and function-typesConclusion and Outlook

Two approaches

Java 8: [Goetz 2013: State of the Lambda]:

I Lambdas with functional interfaces as target types

Javaλ: [Project Lambda 2010, version 0.1.5; Plumicke, PPPJ 2011]:

I Lambdas with real function-types

Martin Plumicke Functional Interfaces vs. Function Types in Java

Page 4: Functional Interfaces vs. Function Types in Java with Lambdaspl/talks/ATPS_14_slides.pdf · Java 8:[Goetz 2013: State of the Lambda]: I Lambdas with functional interfaces as target

IntroductionFunctional interfaces vs. function-types

Proposal: functional interfaces and function-typesConclusion and Outlook

Arguments for functional interfaces [Goetz 2013]

I Mixture of structural and nominal typesI Divergence of library styles:

I some libraries would continue to use callback interfacesI others would use structural function types

I Unwieldy syntax

I Erasures limit overloading of generic function types

Martin Plumicke Functional Interfaces vs. Function Types in Java

Page 5: Functional Interfaces vs. Function Types in Java with Lambdaspl/talks/ATPS_14_slides.pdf · Java 8:[Goetz 2013: State of the Lambda]: I Lambdas with functional interfaces as target

IntroductionFunctional interfaces vs. function-types

Proposal: functional interfaces and function-typesConclusion and Outlook

Lambda–expressions in Java 8

interface Operation {public int op (int x, int y);

}

void doAddition(Operation o) { ... } //functional interface

doAddition(new Operation () { // anonymous inner class

public int op (int x, int y) {return x + y;

}});

doAddition((int x, int y) -> x + y) // lambda expressions

Martin Plumicke Functional Interfaces vs. Function Types in Java

Page 6: Functional Interfaces vs. Function Types in Java with Lambdaspl/talks/ATPS_14_slides.pdf · Java 8:[Goetz 2013: State of the Lambda]: I Lambdas with functional interfaces as target

IntroductionFunctional interfaces vs. function-types

Proposal: functional interfaces and function-typesConclusion and Outlook

Lambda–expressions in Java 8

interface Operation {public int op (int x, int y);

}

void doAddition(Operation o) { ... } //functional interface

doAddition(new Operation () { // anonymous inner class

public int op (int x, int y) {return x + y;

}});

doAddition((int x, int y) -> x + y) // lambda expressions

Martin Plumicke Functional Interfaces vs. Function Types in Java

Page 7: Functional Interfaces vs. Function Types in Java with Lambdaspl/talks/ATPS_14_slides.pdf · Java 8:[Goetz 2013: State of the Lambda]: I Lambdas with functional interfaces as target

IntroductionFunctional interfaces vs. function-types

Proposal: functional interfaces and function-typesConclusion and Outlook

Lambda–expressions in Java 8

interface Operation {public int op (int x, int y);

}

void doAddition(Operation o) { ... } //functional interface

doAddition(new Operation () { // anonymous inner class

public int op (int x, int y) {return x + y;

}});

doAddition((int x, int y) -> x + y) // lambda expressions

Martin Plumicke Functional Interfaces vs. Function Types in Java

Page 8: Functional Interfaces vs. Function Types in Java with Lambdaspl/talks/ATPS_14_slides.pdf · Java 8:[Goetz 2013: State of the Lambda]: I Lambdas with functional interfaces as target

IntroductionFunctional interfaces vs. function-types

Proposal: functional interfaces and function-typesConclusion and Outlook

Lambda–expressions in Java 8

interface Operation {public int op (int x, int y);

}

void doAddition(Operation o) { ... } //functional interface

doAddition(new Operation () { // anonymous inner class

public int op (int x, int y) {return x + y;

}});

doAddition((int x, int y) -> x + y) // lambda expressions

Martin Plumicke Functional Interfaces vs. Function Types in Java

Page 9: Functional Interfaces vs. Function Types in Java with Lambdaspl/talks/ATPS_14_slides.pdf · Java 8:[Goetz 2013: State of the Lambda]: I Lambdas with functional interfaces as target

IntroductionFunctional interfaces vs. function-types

Proposal: functional interfaces and function-typesConclusion and Outlook

Lambda–expressions in Javaλ

void doAddition(#int(int, int) o) { ... } // function type

doAddition((int x, int y) -> x + y) // lambda expressions

Martin Plumicke Functional Interfaces vs. Function Types in Java

Page 10: Functional Interfaces vs. Function Types in Java with Lambdaspl/talks/ATPS_14_slides.pdf · Java 8:[Goetz 2013: State of the Lambda]: I Lambdas with functional interfaces as target

IntroductionFunctional interfaces vs. function-types

Proposal: functional interfaces and function-typesConclusion and Outlook

Function–typesFunctional interfacesSubtypingEvaluation of lambda expressions

Function–types

For ty , tyi ∈ TypeTS(BTV )

# ty (ty1, . . . , tyn) ∈ TypeTS(BTV )1

Subtyping:

# θ (θ′1, . . . , θ′n)≤∗# θ′ (θ1, . . . , θn) iff θ≤∗ θ′ and θi ≤∗ θ′i .

1Sometimes function types # ty (ty1, . . . , tyn) are written as(ty1, . . . , tyn) → ty .

Martin Plumicke Functional Interfaces vs. Function Types in Java

Page 11: Functional Interfaces vs. Function Types in Java with Lambdaspl/talks/ATPS_14_slides.pdf · Java 8:[Goetz 2013: State of the Lambda]: I Lambdas with functional interfaces as target

IntroductionFunctional interfaces vs. function-types

Proposal: functional interfaces and function-typesConclusion and Outlook

Function–typesFunctional interfacesSubtypingEvaluation of lambda expressions

Function–types

For ty , tyi ∈ TypeTS(BTV )

# ty (ty1, . . . , tyn) ∈ TypeTS(BTV )1

Subtyping:

# θ (θ′1, . . . , θ′n)≤∗# θ′ (θ1, . . . , θn) iff θ≤∗ θ′ and θi ≤∗ θ′i .

1Sometimes function types # ty (ty1, . . . , tyn) are written as(ty1, . . . , tyn) → ty .

Martin Plumicke Functional Interfaces vs. Function Types in Java

Page 12: Functional Interfaces vs. Function Types in Java with Lambdaspl/talks/ATPS_14_slides.pdf · Java 8:[Goetz 2013: State of the Lambda]: I Lambdas with functional interfaces as target

IntroductionFunctional interfaces vs. function-types

Proposal: functional interfaces and function-typesConclusion and Outlook

Function–typesFunctional interfacesSubtypingEvaluation of lambda expressions

Matrix example in Javaλ with function–types

class Matrix extends Vector<Vector<Integer>> {//Matrix -> ((Matrix, Matrix) -> Matrix) -> Matrix

##Matrix(#Matrix(Matrix, Matrix))(Matrix)

op = (m) -> (f) -> f.(Matrix.this, m);

//(Vector<Vector<Integer>>, Vector<Vector<Integer>>) -> Matrix

#Matrix(Vector<Vector<Integer>>, Vector<Vector<Integer>>)

mul = (m1,m2) -> { ... }

public static void main(String[] args) {Matrix m1 = new Matrix(...);

Matrix m2 = new Matrix(...);

m1.op.(m2).(m1.mul);} }

#Matrix( Vector<Vector<Integer>>,Vector<Vector<Integer>> )

≤∗ # Matrix (Matrix, Matrix)

Martin Plumicke Functional Interfaces vs. Function Types in Java

Page 13: Functional Interfaces vs. Function Types in Java with Lambdaspl/talks/ATPS_14_slides.pdf · Java 8:[Goetz 2013: State of the Lambda]: I Lambdas with functional interfaces as target

IntroductionFunctional interfaces vs. function-types

Proposal: functional interfaces and function-typesConclusion and Outlook

Function–typesFunctional interfacesSubtypingEvaluation of lambda expressions

Matrix example in Javaλ with function–types

class Matrix extends Vector<Vector<Integer>> {//Matrix -> ((Matrix, Matrix) -> Matrix) -> Matrix

##Matrix(#Matrix(Matrix, Matrix))(Matrix)

op = (m) -> (f) -> f.(Matrix.this, m);

//(Vector<Vector<Integer>>, Vector<Vector<Integer>>) -> Matrix

#Matrix(Vector<Vector<Integer>>, Vector<Vector<Integer>>)

mul = (m1,m2) -> { ... }

public static void main(String[] args) {Matrix m1 = new Matrix(...);

Matrix m2 = new Matrix(...);

m1.op.(m2).(m1.mul);} }

#Matrix( Vector<Vector<Integer>>,Vector<Vector<Integer>> )

≤∗ # Matrix (Matrix, Matrix)

Martin Plumicke Functional Interfaces vs. Function Types in Java

Page 14: Functional Interfaces vs. Function Types in Java with Lambdaspl/talks/ATPS_14_slides.pdf · Java 8:[Goetz 2013: State of the Lambda]: I Lambdas with functional interfaces as target

IntroductionFunctional interfaces vs. function-types

Proposal: functional interfaces and function-typesConclusion and Outlook

Function–typesFunctional interfacesSubtypingEvaluation of lambda expressions

Matrix example in Javaλ with function–types

class Matrix extends Vector<Vector<Integer>> {//Matrix -> ((Matrix, Matrix) -> Matrix) -> Matrix

##Matrix(#Matrix(Matrix, Matrix))(Matrix)

op = (m) -> (f) -> f.(Matrix.this, m);

//(Vector<Vector<Integer>>, Vector<Vector<Integer>>) -> Matrix

#Matrix(Vector<Vector<Integer>>, Vector<Vector<Integer>>)

mul = (m1,m2) -> { ... }

public static void main(String[] args) {Matrix m1 = new Matrix(...);

Matrix m2 = new Matrix(...);

m1.op.(m2).(m1.mul);} }

#Matrix( Vector<Vector<Integer>>,Vector<Vector<Integer>> )

≤∗ # Matrix (Matrix, Matrix)

Martin Plumicke Functional Interfaces vs. Function Types in Java

Page 15: Functional Interfaces vs. Function Types in Java with Lambdaspl/talks/ATPS_14_slides.pdf · Java 8:[Goetz 2013: State of the Lambda]: I Lambdas with functional interfaces as target

IntroductionFunctional interfaces vs. function-types

Proposal: functional interfaces and function-typesConclusion and Outlook

Function–typesFunctional interfacesSubtypingEvaluation of lambda expressions

Matrix example in Javaλ with function–types

class Matrix extends Vector<Vector<Integer>> {//Matrix -> ((Matrix, Matrix) -> Matrix) -> Matrix

##Matrix(#Matrix(Matrix, Matrix))(Matrix)

op = (m) -> (f) -> f.(Matrix.this, m);

//(Vector<Vector<Integer>>, Vector<Vector<Integer>>) -> Matrix

#Matrix(Vector<Vector<Integer>>, Vector<Vector<Integer>>)

mul = (m1,m2) -> { ... }

public static void main(String[] args) {Matrix m1 = new Matrix(...);

Matrix m2 = new Matrix(...);

m1.op.(m2).(m1.mul);} }

#Matrix( Vector<Vector<Integer>>,Vector<Vector<Integer>> )

≤∗ # Matrix (Matrix, Matrix)

Martin Plumicke Functional Interfaces vs. Function Types in Java

Page 16: Functional Interfaces vs. Function Types in Java with Lambdaspl/talks/ATPS_14_slides.pdf · Java 8:[Goetz 2013: State of the Lambda]: I Lambdas with functional interfaces as target

IntroductionFunctional interfaces vs. function-types

Proposal: functional interfaces and function-typesConclusion and Outlook

Function–typesFunctional interfacesSubtypingEvaluation of lambda expressions

Types of lambda expressions in Java 8

Functional interfaces: Interfaces with a single method (SAM–types) astarget types for lambda expressions.

E.g.

interface Comparator<T> { int compare(T x, T y); }interface FileFilter { boolean accept(File x); }interface DirectoryStream.Filter<T> { boolean accept(T x); }interface Runnable { void run(); }interface ActionListener { void actionPerformed(...); }interface Callable<T> { T call(); }

Martin Plumicke Functional Interfaces vs. Function Types in Java

Page 17: Functional Interfaces vs. Function Types in Java with Lambdaspl/talks/ATPS_14_slides.pdf · Java 8:[Goetz 2013: State of the Lambda]: I Lambdas with functional interfaces as target

IntroductionFunctional interfaces vs. function-types

Proposal: functional interfaces and function-typesConclusion and Outlook

Function–typesFunctional interfacesSubtypingEvaluation of lambda expressions

Types of lambda expressions in Java 8

Functional interfaces: Interfaces with a single method (SAM–types) astarget types for lambda expressions.

E.g.

interface Comparator<T> { int compare(T x, T y); }interface FileFilter { boolean accept(File x); }interface DirectoryStream.Filter<T> { boolean accept(T x); }interface Runnable { void run(); }interface ActionListener { void actionPerformed(...); }interface Callable<T> { T call(); }

Martin Plumicke Functional Interfaces vs. Function Types in Java

Page 18: Functional Interfaces vs. Function Types in Java with Lambdaspl/talks/ATPS_14_slides.pdf · Java 8:[Goetz 2013: State of the Lambda]: I Lambdas with functional interfaces as target

IntroductionFunctional interfaces vs. function-types

Proposal: functional interfaces and function-typesConclusion and Outlook

Function–typesFunctional interfacesSubtypingEvaluation of lambda expressions

Target typing

I The lambda expressions have no explicit types

I The target types are deduced from the context

I Not all target types are correct

Operation O = (int x, int y) -> x + y; //correct

Operation O = (String s) -> s + s; //incorrect

A correct target type is called compatible.

Martin Plumicke Functional Interfaces vs. Function Types in Java

Page 19: Functional Interfaces vs. Function Types in Java with Lambdaspl/talks/ATPS_14_slides.pdf · Java 8:[Goetz 2013: State of the Lambda]: I Lambdas with functional interfaces as target

IntroductionFunctional interfaces vs. function-types

Proposal: functional interfaces and function-typesConclusion and Outlook

Function–typesFunctional interfacesSubtypingEvaluation of lambda expressions

Target typing

I The lambda expressions have no explicit types

I The target types are deduced from the context

I Not all target types are correct

Operation O = (int x, int y) -> x + y; //correct

Operation O = (String s) -> s + s; //incorrect

A correct target type is called compatible.

Martin Plumicke Functional Interfaces vs. Function Types in Java

Page 20: Functional Interfaces vs. Function Types in Java with Lambdaspl/talks/ATPS_14_slides.pdf · Java 8:[Goetz 2013: State of the Lambda]: I Lambdas with functional interfaces as target

IntroductionFunctional interfaces vs. function-types

Proposal: functional interfaces and function-typesConclusion and Outlook

Function–typesFunctional interfacesSubtypingEvaluation of lambda expressions

Target typing

I The lambda expressions have no explicit types

I The target types are deduced from the context

I Not all target types are correct

Operation O = (int x, int y) -> x + y; //correct

Operation O = (String s) -> s + s; //incorrect

A correct target type is called compatible.

Martin Plumicke Functional Interfaces vs. Function Types in Java

Page 21: Functional Interfaces vs. Function Types in Java with Lambdaspl/talks/ATPS_14_slides.pdf · Java 8:[Goetz 2013: State of the Lambda]: I Lambdas with functional interfaces as target

IntroductionFunctional interfaces vs. function-types

Proposal: functional interfaces and function-typesConclusion and Outlook

Function–typesFunctional interfacesSubtypingEvaluation of lambda expressions

Functional interfaces as compatible target types

A lambda expression is compatible with a type T , if

I T is a functional interface type

I The lambda expression has the same number of parameters as T ’smethod, and those parameters’ types are the same

I Each expression returned by the lambda body is compatible withT ’s method’s return type

I Each exception thrown by the lambda body is allowed by T ’smethod’s throws clause

Lemma: There is an equivalence class of compatible target types for alambda expression.

Martin Plumicke Functional Interfaces vs. Function Types in Java

Page 22: Functional Interfaces vs. Function Types in Java with Lambdaspl/talks/ATPS_14_slides.pdf · Java 8:[Goetz 2013: State of the Lambda]: I Lambdas with functional interfaces as target

IntroductionFunctional interfaces vs. function-types

Proposal: functional interfaces and function-typesConclusion and Outlook

Function–typesFunctional interfacesSubtypingEvaluation of lambda expressions

Functional interfaces as compatible target types

A lambda expression is compatible with a type T , if

I T is a functional interface type

I The lambda expression has the same number of parameters as T ’smethod, and those parameters’ types are the same

I Each expression returned by the lambda body is compatible withT ’s method’s return type

I Each exception thrown by the lambda body is allowed by T ’smethod’s throws clause

Lemma: There is an equivalence class of compatible target types for alambda expression.

Martin Plumicke Functional Interfaces vs. Function Types in Java

Page 23: Functional Interfaces vs. Function Types in Java with Lambdaspl/talks/ATPS_14_slides.pdf · Java 8:[Goetz 2013: State of the Lambda]: I Lambdas with functional interfaces as target

IntroductionFunctional interfaces vs. function-types

Proposal: functional interfaces and function-typesConclusion and Outlook

Function–typesFunctional interfacesSubtypingEvaluation of lambda expressions

Canonical representative

For the equivalence class of the compatible target types of a lambdaexpression, there is a canonical representative

FunN <R,T1, . . . ,T N>

with

interface FunN <R,T1, ..., TN >

{ R apply(T1 arg1 , ..., TN argN ); }

if the type of the single method of a compatible target type is

(T1, . . . ,T N)→ R

Martin Plumicke Functional Interfaces vs. Function Types in Java

Page 24: Functional Interfaces vs. Function Types in Java with Lambdaspl/talks/ATPS_14_slides.pdf · Java 8:[Goetz 2013: State of the Lambda]: I Lambdas with functional interfaces as target

IntroductionFunctional interfaces vs. function-types

Proposal: functional interfaces and function-typesConclusion and Outlook

Function–typesFunctional interfacesSubtypingEvaluation of lambda expressions

Example (compatible)

interface Fun1<R,T> { R apply(T arg); }

interface Add { Fun1<Integer,Integer> add (Integer a); }

I (Integer x) -> (Integer y) -> (x + y) is compatible withAdd

I (Integer y) -> (x + y) is compatible withFun1<Integer, Integer>

Martin Plumicke Functional Interfaces vs. Function Types in Java

Page 25: Functional Interfaces vs. Function Types in Java with Lambdaspl/talks/ATPS_14_slides.pdf · Java 8:[Goetz 2013: State of the Lambda]: I Lambdas with functional interfaces as target

IntroductionFunctional interfaces vs. function-types

Proposal: functional interfaces and function-typesConclusion and Outlook

Function–typesFunctional interfacesSubtypingEvaluation of lambda expressions

Example (compatible)

interface Fun1<R,T> { R apply(T arg); }

interface Add { Fun1<Integer,Integer> add (Integer a); }

I (Integer x) -> (Integer y) -> (x + y) is compatible withAdd

I (Integer y) -> (x + y) is compatible withFun1<Integer, Integer>

Martin Plumicke Functional Interfaces vs. Function Types in Java

Page 26: Functional Interfaces vs. Function Types in Java with Lambdaspl/talks/ATPS_14_slides.pdf · Java 8:[Goetz 2013: State of the Lambda]: I Lambdas with functional interfaces as target

IntroductionFunctional interfaces vs. function-types

Proposal: functional interfaces and function-typesConclusion and Outlook

Function–typesFunctional interfacesSubtypingEvaluation of lambda expressions

Example matrix with functional interfaces

class Matrix extends Vector<Vector<Integer>> {

//Matrix -> ((Matrix, Matrix) -> Matrix) -> Matrix

Fun1<Fun1<Matrix, Fun2<Matrix, Matrix,Matrix>>, Matrix>

op = (m) -> (f) -> f.apply(this, m);

//(Matrix, Matrix) -> Matrix

Fun2<Matrix, Matrix,Matrix>

mul = (m1, m2) -> { ... }

public static void main(String[] args) {Matrix m1 = new Matrix(...);

Matrix m2 = new Matrix(...);

(m1.op.apply(m2)).apply(m1.mul);} }

Fun2<Matrix, Vector<Vector<Integer>>,>Vector<Vector<Integer>>.

6≤∗ Fun2<Matrix, Matrix, Matrix>

Martin Plumicke Functional Interfaces vs. Function Types in Java

Page 27: Functional Interfaces vs. Function Types in Java with Lambdaspl/talks/ATPS_14_slides.pdf · Java 8:[Goetz 2013: State of the Lambda]: I Lambdas with functional interfaces as target

IntroductionFunctional interfaces vs. function-types

Proposal: functional interfaces and function-typesConclusion and Outlook

Function–typesFunctional interfacesSubtypingEvaluation of lambda expressions

Example matrix with functional interfaces

class Matrix extends Vector<Vector<Integer>> {

//Matrix -> ((Matrix, Matrix) -> Matrix) -> Matrix

Fun1<Fun1<Matrix, Fun2<Matrix, Matrix,Matrix>>, Matrix>

op = (m) -> (f) -> f.apply(this, m);

//(Matrix, Matrix) -> Matrix

Fun2<Matrix, Matrix,Matrix>

mul = (m1, m2) -> { ... }

public static void main(String[] args) {Matrix m1 = new Matrix(...);

Matrix m2 = new Matrix(...);

(m1.op.apply(m2)).apply(m1.mul);} }

Fun2<Matrix, Vector<Vector<Integer>>,>Vector<Vector<Integer>>.

6≤∗ Fun2<Matrix, Matrix, Matrix>

Martin Plumicke Functional Interfaces vs. Function Types in Java

Page 28: Functional Interfaces vs. Function Types in Java with Lambdaspl/talks/ATPS_14_slides.pdf · Java 8:[Goetz 2013: State of the Lambda]: I Lambdas with functional interfaces as target

IntroductionFunctional interfaces vs. function-types

Proposal: functional interfaces and function-typesConclusion and Outlook

Function–typesFunctional interfacesSubtypingEvaluation of lambda expressions

Example matrix with functional interfaces

class Matrix extends Vector<Vector<Integer>> {

//Matrix -> ((Matrix, Matrix) -> Matrix) -> Matrix

Fun1<Fun1<Matrix, Fun2<Matrix, Matrix,Matrix>>, Matrix>

op = (m) -> (f) -> f.apply(this, m);

//(Matrix, Matrix) -> Matrix

Fun2<Matrix, Matrix,Matrix>

mul = (m1, m2) -> { ... }

public static void main(String[] args) {Matrix m1 = new Matrix(...);

Matrix m2 = new Matrix(...);

(m1.op.apply(m2)).apply(m1.mul);} }

Fun2<Matrix, Vector<Vector<Integer>>,>Vector<Vector<Integer>>.

6≤∗ Fun2<Matrix, Matrix, Matrix>

Martin Plumicke Functional Interfaces vs. Function Types in Java

Page 29: Functional Interfaces vs. Function Types in Java with Lambdaspl/talks/ATPS_14_slides.pdf · Java 8:[Goetz 2013: State of the Lambda]: I Lambdas with functional interfaces as target

IntroductionFunctional interfaces vs. function-types

Proposal: functional interfaces and function-typesConclusion and Outlook

Function–typesFunctional interfacesSubtypingEvaluation of lambda expressions

Example matrix with functional interfaces

class Matrix extends Vector<Vector<Integer>> {

//Matrix -> ((Matrix, Matrix) -> Matrix) -> Matrix

Fun1<Fun1<Matrix, Fun2<Matrix, Matrix,Matrix>>, Matrix>

op = (m) -> (f) -> f.apply(this, m);

//(Matrix, Matrix) -> Matrix

Fun2<Matrix, Matrix,Matrix>

mul = (m1, m2) -> { ... }

public static void main(String[] args) {Matrix m1 = new Matrix(...);

Matrix m2 = new Matrix(...);

(m1.op.apply(m2)).apply(m1.mul);} }

Fun2<Matrix, Vector<Vector<Integer>>,>Vector<Vector<Integer>>.

6≤∗ Fun2<Matrix, Matrix, Matrix>Martin Plumicke Functional Interfaces vs. Function Types in Java

Page 30: Functional Interfaces vs. Function Types in Java with Lambdaspl/talks/ATPS_14_slides.pdf · Java 8:[Goetz 2013: State of the Lambda]: I Lambdas with functional interfaces as target

IntroductionFunctional interfaces vs. function-types

Proposal: functional interfaces and function-typesConclusion and Outlook

Function–typesFunctional interfacesSubtypingEvaluation of lambda expressions

Subtyping

(T ′1, . . . ,T′N)→ T0 ≤∗ (T1, . . . ,TN)→ T ′0, iff Ti ≤∗ T ′i

FunN <T0,T′1, . . . ,T

′N> 6≤∗ FunN <T ′0,T1, . . . ,TN>, for Ti �∗ T ′i

Background: Variance of type parameters

Martin Plumicke Functional Interfaces vs. Function Types in Java

Page 31: Functional Interfaces vs. Function Types in Java with Lambdaspl/talks/ATPS_14_slides.pdf · Java 8:[Goetz 2013: State of the Lambda]: I Lambdas with functional interfaces as target

IntroductionFunctional interfaces vs. function-types

Proposal: functional interfaces and function-typesConclusion and Outlook

Function–typesFunctional interfacesSubtypingEvaluation of lambda expressions

Subtyping

(T ′1, . . . ,T′N)→ T0 ≤∗ (T1, . . . ,TN)→ T ′0, iff Ti ≤∗ T ′i

FunN <T0,T′1, . . . ,T

′N> 6≤∗ FunN <T ′0,T1, . . . ,TN>, for Ti �∗ T ′i

Background: Variance of type parameters

Martin Plumicke Functional Interfaces vs. Function Types in Java

Page 32: Functional Interfaces vs. Function Types in Java with Lambdaspl/talks/ATPS_14_slides.pdf · Java 8:[Goetz 2013: State of the Lambda]: I Lambdas with functional interfaces as target

IntroductionFunctional interfaces vs. function-types

Proposal: functional interfaces and function-typesConclusion and Outlook

Function–typesFunctional interfacesSubtypingEvaluation of lambda expressions

Subtyping

(T ′1, . . . ,T′N)→ T0 ≤∗ (T1, . . . ,TN)→ T ′0, iff Ti ≤∗ T ′i

FunN <T0,T′1, . . . ,T

′N> 6≤∗ FunN <T ′0,T1, . . . ,TN>, for Ti �∗ T ′i

Background: Variance of type parameters

Martin Plumicke Functional Interfaces vs. Function Types in Java

Page 33: Functional Interfaces vs. Function Types in Java with Lambdaspl/talks/ATPS_14_slides.pdf · Java 8:[Goetz 2013: State of the Lambda]: I Lambdas with functional interfaces as target

IntroductionFunctional interfaces vs. function-types

Proposal: functional interfaces and function-typesConclusion and Outlook

Function–typesFunctional interfacesSubtypingEvaluation of lambda expressions

Example (result types):

Integer → Integer ≤∗ Integer → Object

butFun1<Integer,Integer> idIntInt = (Integer x) -> x

Fun1<Object,Integer> idIntObj = idIntInt

is wrong!, as

Fun1<Integer,Integer> 6≤∗ Fun1<Object,Integer>

Fun1<Integer,Integer> idIntInt = (Integer x) -> x;

Fun1<? extends Object, Integer> idIntExtObj = idIntInt;

is correct!, as

Fun1<Integer,Integer> ≤∗ Fun1<? extends Object, Integer>

Martin Plumicke Functional Interfaces vs. Function Types in Java

Page 34: Functional Interfaces vs. Function Types in Java with Lambdaspl/talks/ATPS_14_slides.pdf · Java 8:[Goetz 2013: State of the Lambda]: I Lambdas with functional interfaces as target

IntroductionFunctional interfaces vs. function-types

Proposal: functional interfaces and function-typesConclusion and Outlook

Function–typesFunctional interfacesSubtypingEvaluation of lambda expressions

Example (result types):

Integer → Integer ≤∗ Integer → Object

butFun1<Integer,Integer> idIntInt = (Integer x) -> x

Fun1<Object,Integer> idIntObj = idIntInt

is wrong!, as

Fun1<Integer,Integer> 6≤∗ Fun1<Object,Integer>

Fun1<Integer,Integer> idIntInt = (Integer x) -> x;

Fun1<? extends Object, Integer> idIntExtObj = idIntInt;

is correct!, as

Fun1<Integer,Integer> ≤∗ Fun1<? extends Object, Integer>

Martin Plumicke Functional Interfaces vs. Function Types in Java

Page 35: Functional Interfaces vs. Function Types in Java with Lambdaspl/talks/ATPS_14_slides.pdf · Java 8:[Goetz 2013: State of the Lambda]: I Lambdas with functional interfaces as target

IntroductionFunctional interfaces vs. function-types

Proposal: functional interfaces and function-typesConclusion and Outlook

Function–typesFunctional interfacesSubtypingEvaluation of lambda expressions

Example (result types):

Integer → Integer ≤∗ Integer → Object

butFun1<Integer,Integer> idIntInt = (Integer x) -> x

Fun1<Object,Integer> idIntObj = idIntInt

is wrong!, as

Fun1<Integer,Integer> 6≤∗ Fun1<Object,Integer>

Fun1<Integer,Integer> idIntInt = (Integer x) -> x;

Fun1<? extends Object, Integer> idIntExtObj = idIntInt;

is correct!, as

Fun1<Integer,Integer> ≤∗ Fun1<? extends Object, Integer>

Martin Plumicke Functional Interfaces vs. Function Types in Java

Page 36: Functional Interfaces vs. Function Types in Java with Lambdaspl/talks/ATPS_14_slides.pdf · Java 8:[Goetz 2013: State of the Lambda]: I Lambdas with functional interfaces as target

IntroductionFunctional interfaces vs. function-types

Proposal: functional interfaces and function-typesConclusion and Outlook

Function–typesFunctional interfacesSubtypingEvaluation of lambda expressions

Example (argument type)

Number → Integer ≤∗ Integer → Integer

but

Fun1<Integer,Number> idNumInt = (Number x) -> (Integer)x

Fun1<Integer,Integer> idIntInt = idNumInt

is wrong!, as

Fun1<Integer,Number> 6≤∗ Fun1<Integer,Integer>

Fun1<Integer, Number> idNumInt = (Number x) -> (Integer)x;

Fun1<Integer, ? super Integer> idSupIntInt = idNumInt;

is correct!, as

Fun1<Integer, Number> ≤∗ Fun1<Integer, ? super Integer>

Martin Plumicke Functional Interfaces vs. Function Types in Java

Page 37: Functional Interfaces vs. Function Types in Java with Lambdaspl/talks/ATPS_14_slides.pdf · Java 8:[Goetz 2013: State of the Lambda]: I Lambdas with functional interfaces as target

IntroductionFunctional interfaces vs. function-types

Proposal: functional interfaces and function-typesConclusion and Outlook

Function–typesFunctional interfacesSubtypingEvaluation of lambda expressions

Example (argument type)

Number → Integer ≤∗ Integer → Integer

but

Fun1<Integer,Number> idNumInt = (Number x) -> (Integer)x

Fun1<Integer,Integer> idIntInt = idNumInt

is wrong!, as

Fun1<Integer,Number> 6≤∗ Fun1<Integer,Integer>

Fun1<Integer, Number> idNumInt = (Number x) -> (Integer)x;

Fun1<Integer, ? super Integer> idSupIntInt = idNumInt;

is correct!, as

Fun1<Integer, Number> ≤∗ Fun1<Integer, ? super Integer>

Martin Plumicke Functional Interfaces vs. Function Types in Java

Page 38: Functional Interfaces vs. Function Types in Java with Lambdaspl/talks/ATPS_14_slides.pdf · Java 8:[Goetz 2013: State of the Lambda]: I Lambdas with functional interfaces as target

IntroductionFunctional interfaces vs. function-types

Proposal: functional interfaces and function-typesConclusion and Outlook

Function–typesFunctional interfacesSubtypingEvaluation of lambda expressions

Example (argument type)

Number → Integer ≤∗ Integer → Integer

but

Fun1<Integer,Number> idNumInt = (Number x) -> (Integer)x

Fun1<Integer,Integer> idIntInt = idNumInt

is wrong!, as

Fun1<Integer,Number> 6≤∗ Fun1<Integer,Integer>

Fun1<Integer, Number> idNumInt = (Number x) -> (Integer)x;

Fun1<Integer, ? super Integer> idSupIntInt = idNumInt;

is correct!, as

Fun1<Integer, Number> ≤∗ Fun1<Integer, ? super Integer>

Martin Plumicke Functional Interfaces vs. Function Types in Java

Page 39: Functional Interfaces vs. Function Types in Java with Lambdaspl/talks/ATPS_14_slides.pdf · Java 8:[Goetz 2013: State of the Lambda]: I Lambdas with functional interfaces as target

IntroductionFunctional interfaces vs. function-types

Proposal: functional interfaces and function-typesConclusion and Outlook

Function–typesFunctional interfacesSubtypingEvaluation of lambda expressions

Example (combination argument and result type)

Number → Integer ≤∗ Integer → Object

Fun1<Integer, Number> idNumInt = (Number x) -> (Integer)x;

Fun1<? extends Object, ? super Integer> idSupIntExtObj = idNumInt;

as

Fun1<Integer, Number> ≤∗ Fun1<? extends Object, ? super Integer>

Martin Plumicke Functional Interfaces vs. Function Types in Java

Page 40: Functional Interfaces vs. Function Types in Java with Lambdaspl/talks/ATPS_14_slides.pdf · Java 8:[Goetz 2013: State of the Lambda]: I Lambdas with functional interfaces as target

IntroductionFunctional interfaces vs. function-types

Proposal: functional interfaces and function-typesConclusion and Outlook

Function–typesFunctional interfacesSubtypingEvaluation of lambda expressions

Example (combination argument and result type)

Number → Integer ≤∗ Integer → Object

Fun1<Integer, Number> idNumInt = (Number x) -> (Integer)x;

Fun1<? extends Object, ? super Integer> idSupIntExtObj = idNumInt;

as

Fun1<Integer, Number> ≤∗ Fun1<? extends Object, ? super Integer>

Martin Plumicke Functional Interfaces vs. Function Types in Java

Page 41: Functional Interfaces vs. Function Types in Java with Lambdaspl/talks/ATPS_14_slides.pdf · Java 8:[Goetz 2013: State of the Lambda]: I Lambdas with functional interfaces as target

IntroductionFunctional interfaces vs. function-types

Proposal: functional interfaces and function-typesConclusion and Outlook

Function–typesFunctional interfacesSubtypingEvaluation of lambda expressions

Example (combination argument and result type)

Number → Integer ≤∗ Integer → Object

Fun1<Integer, Number> idNumInt = (Number x) -> (Integer)x;

Fun1<? extends Object, ? super Integer> idSupIntExtObj = idNumInt;

as

Fun1<Integer, Number> ≤∗ Fun1<? extends Object, ? super Integer>

Martin Plumicke Functional Interfaces vs. Function Types in Java

Page 42: Functional Interfaces vs. Function Types in Java with Lambdaspl/talks/ATPS_14_slides.pdf · Java 8:[Goetz 2013: State of the Lambda]: I Lambdas with functional interfaces as target

IntroductionFunctional interfaces vs. function-types

Proposal: functional interfaces and function-typesConclusion and Outlook

Function–typesFunctional interfacesSubtypingEvaluation of lambda expressions

Type parameter subtyping in Java 8

It holds

FunN <T0,T′1, . . . ,T

′N> ≤∗

FunN <? extendsT ′0, ? superT1, . . . , ? superTN>,

for Ti ≤∗ T ′i .

Martin Plumicke Functional Interfaces vs. Function Types in Java

Page 43: Functional Interfaces vs. Function Types in Java with Lambdaspl/talks/ATPS_14_slides.pdf · Java 8:[Goetz 2013: State of the Lambda]: I Lambdas with functional interfaces as target

IntroductionFunctional interfaces vs. function-types

Proposal: functional interfaces and function-typesConclusion and Outlook

Function–typesFunctional interfacesSubtypingEvaluation of lambda expressions

Example matrix with functional interfaces and subtyping

class Mat extends Vector<Vector<Integer>> {

Fun1<Fun1<Mat, Fun2<Mat, ? super Mat, ? super Mat>>, Mat>

op = (m) -> (f) -> f.apply(this, m);

Fun2<Mat, Vector<Vector<Integer>>,Vector<Vector<Integer>>>

mul = (m1, m2) -> { . . . }

public static void main(String[] args) {Mat m1 = new Mat(...);

Mat m2 = new Mat(...);

(m1.op.apply(m2)).apply(m1.mul);} }

Fun2<Mat, Vector<Vector<Integer>>,>Vector<Vector<Integer>>.

≤∗ Fun2<Mat, ? super Mat, ? super Mat>

Martin Plumicke Functional Interfaces vs. Function Types in Java

Page 44: Functional Interfaces vs. Function Types in Java with Lambdaspl/talks/ATPS_14_slides.pdf · Java 8:[Goetz 2013: State of the Lambda]: I Lambdas with functional interfaces as target

IntroductionFunctional interfaces vs. function-types

Proposal: functional interfaces and function-typesConclusion and Outlook

Function–typesFunctional interfacesSubtypingEvaluation of lambda expressions

Example matrix with functional interfaces and subtyping

class Mat extends Vector<Vector<Integer>> {

Fun1<Fun1<Mat, Fun2<Mat, ? super Mat, ? super Mat>>, Mat>

op = (m) -> (f) -> f.apply(this, m);

Fun2<Mat, Vector<Vector<Integer>>,Vector<Vector<Integer>>>

mul = (m1, m2) -> { . . . }

public static void main(String[] args) {Mat m1 = new Mat(...);

Mat m2 = new Mat(...);

(m1.op.apply(m2)).apply(m1.mul);} }

Fun2<Mat, Vector<Vector<Integer>>,>Vector<Vector<Integer>>.

≤∗ Fun2<Mat, ? super Mat, ? super Mat>

Martin Plumicke Functional Interfaces vs. Function Types in Java

Page 45: Functional Interfaces vs. Function Types in Java with Lambdaspl/talks/ATPS_14_slides.pdf · Java 8:[Goetz 2013: State of the Lambda]: I Lambdas with functional interfaces as target

IntroductionFunctional interfaces vs. function-types

Proposal: functional interfaces and function-typesConclusion and Outlook

Function–typesFunctional interfacesSubtypingEvaluation of lambda expressions

Example matrix with functional interfaces and subtyping

class Mat extends Vector<Vector<Integer>> {

Fun1<Fun1<Mat, Fun2<Mat, ? super Mat, ? super Mat>>, Mat>

op = (m) -> (f) -> f.apply(this, m);

Fun2<Mat, Vector<Vector<Integer>>,Vector<Vector<Integer>>>

mul = (m1, m2) -> { . . . }

public static void main(String[] args) {Mat m1 = new Mat(...);

Mat m2 = new Mat(...);

(m1.op.apply(m2)).apply(m1.mul);} }

Fun2<Mat, Vector<Vector<Integer>>,>Vector<Vector<Integer>>.

≤∗ Fun2<Mat, ? super Mat, ? super Mat>

Martin Plumicke Functional Interfaces vs. Function Types in Java

Page 46: Functional Interfaces vs. Function Types in Java with Lambdaspl/talks/ATPS_14_slides.pdf · Java 8:[Goetz 2013: State of the Lambda]: I Lambdas with functional interfaces as target

IntroductionFunctional interfaces vs. function-types

Proposal: functional interfaces and function-typesConclusion and Outlook

Function–typesFunctional interfacesSubtypingEvaluation of lambda expressions

Example matrix with functional interfaces and subtyping

class Mat extends Vector<Vector<Integer>> {

Fun1<Fun1<Mat, Fun2<Mat, ? super Mat, ? super Mat>>, Mat>

op = (m) -> (f) -> f.apply(this, m);

Fun2<Mat, Vector<Vector<Integer>>,Vector<Vector<Integer>>>

mul = (m1, m2) -> { . . . }

public static void main(String[] args) {Mat m1 = new Mat(...);

Mat m2 = new Mat(...);

(m1.op.apply(m2)).apply(m1.mul);} }

Fun2<Mat, Vector<Vector<Integer>>,>Vector<Vector<Integer>>.

≤∗ Fun2<Mat, ? super Mat, ? super Mat>

Martin Plumicke Functional Interfaces vs. Function Types in Java

Page 47: Functional Interfaces vs. Function Types in Java with Lambdaspl/talks/ATPS_14_slides.pdf · Java 8:[Goetz 2013: State of the Lambda]: I Lambdas with functional interfaces as target

IntroductionFunctional interfaces vs. function-types

Proposal: functional interfaces and function-typesConclusion and Outlook

Function–typesFunctional interfacesSubtypingEvaluation of lambda expressions

Function-application

in Javaλ (with type–inference):

((x1,..., xN) -> h(x1,..., xN)).(arg1....,argN);

in Java 8:

((x1,..., xN) -> h(x1,..., xN)).apply(arg1....,argN);

wrong!, no lambda expression is allowed as receiver

((FunN<T0, T1, . . . , TN> )

(x1,..., xN) -> h(x1,..., xN)).apply(arg1....,argN);

ok!, as there is cast–expression

Martin Plumicke Functional Interfaces vs. Function Types in Java

Page 48: Functional Interfaces vs. Function Types in Java with Lambdaspl/talks/ATPS_14_slides.pdf · Java 8:[Goetz 2013: State of the Lambda]: I Lambdas with functional interfaces as target

IntroductionFunctional interfaces vs. function-types

Proposal: functional interfaces and function-typesConclusion and Outlook

Function–typesFunctional interfacesSubtypingEvaluation of lambda expressions

Function-application

in Javaλ (with type–inference):

((x1,..., xN) -> h(x1,..., xN)).(arg1....,argN);

in Java 8:

((x1,..., xN) -> h(x1,..., xN)).apply(arg1....,argN);

wrong!, no lambda expression is allowed as receiver

((FunN<T0, T1, . . . , TN> )

(x1,..., xN) -> h(x1,..., xN)).apply(arg1....,argN);

ok!, as there is cast–expression

Martin Plumicke Functional Interfaces vs. Function Types in Java

Page 49: Functional Interfaces vs. Function Types in Java with Lambdaspl/talks/ATPS_14_slides.pdf · Java 8:[Goetz 2013: State of the Lambda]: I Lambdas with functional interfaces as target

IntroductionFunctional interfaces vs. function-types

Proposal: functional interfaces and function-typesConclusion and Outlook

Function–typesFunctional interfacesSubtypingEvaluation of lambda expressions

Function-application

in Javaλ (with type–inference):

((x1,..., xN) -> h(x1,..., xN)).(arg1....,argN);

in Java 8:

((x1,..., xN) -> h(x1,..., xN)).apply(arg1....,argN);

wrong!, no lambda expression is allowed as receiver

((FunN<T0, T1, . . . , TN> )

(x1,..., xN) -> h(x1,..., xN)).apply(arg1....,argN);

ok!, as there is cast–expression

Martin Plumicke Functional Interfaces vs. Function Types in Java

Page 50: Functional Interfaces vs. Function Types in Java with Lambdaspl/talks/ATPS_14_slides.pdf · Java 8:[Goetz 2013: State of the Lambda]: I Lambdas with functional interfaces as target

IntroductionFunctional interfaces vs. function-types

Proposal: functional interfaces and function-typesConclusion and Outlook

Function–typesFunctional interfacesSubtypingEvaluation of lambda expressions

Currying f : T1 → T2 → . . .→ TN → T0

Application:

in Java 8:

((Fun1<Fun1<Fun1<. . . Fun1<T0, TN>, . . .>, T2>, T1> )

(x1) -> (x2) ->...-> (xN) -> h(x1,...,XN))

.apply(a1).apply(a2).....apply(aN))

in Javaλ: (with type–inference):

((x1) -> (x2) ->...-> (xN) -> h(x1,...,XN)).a1.a2.....aN

Martin Plumicke Functional Interfaces vs. Function Types in Java

Page 51: Functional Interfaces vs. Function Types in Java with Lambdaspl/talks/ATPS_14_slides.pdf · Java 8:[Goetz 2013: State of the Lambda]: I Lambdas with functional interfaces as target

IntroductionFunctional interfaces vs. function-types

Proposal: functional interfaces and function-typesConclusion and Outlook

Function–typesFunctional interfacesSubtypingEvaluation of lambda expressions

Currying f : T1 → T2 → . . .→ TN → T0

Application:

in Java 8:

((Fun1<Fun1<Fun1<. . . Fun1<T0, TN>, . . .>, T2>, T1> )

(x1) -> (x2) ->...-> (xN) -> h(x1,...,XN))

.apply(a1).apply(a2).....apply(aN))

in Javaλ: (with type–inference):

((x1) -> (x2) ->...-> (xN) -> h(x1,...,XN)).a1.a2.....aN

Martin Plumicke Functional Interfaces vs. Function Types in Java

Page 52: Functional Interfaces vs. Function Types in Java with Lambdaspl/talks/ATPS_14_slides.pdf · Java 8:[Goetz 2013: State of the Lambda]: I Lambdas with functional interfaces as target

IntroductionFunctional interfaces vs. function-types

Proposal: functional interfaces and function-typesConclusion and Outlook

Function–typesFunctional interfacesSubtypingEvaluation of lambda expressions

Simulation of function-types by functional interfaces

Summary:

1. Introduction of canonical representatives FunN

2. Subtyping by using wildcards

3. Currying by introduction of type-casts

Possible but not beautiful!

Martin Plumicke Functional Interfaces vs. Function Types in Java

Page 53: Functional Interfaces vs. Function Types in Java with Lambdaspl/talks/ATPS_14_slides.pdf · Java 8:[Goetz 2013: State of the Lambda]: I Lambdas with functional interfaces as target

IntroductionFunctional interfaces vs. function-types

Proposal: functional interfaces and function-typesConclusion and Outlook

Function–typesFunctional interfacesSubtypingEvaluation of lambda expressions

Simulation of function-types by functional interfaces

Summary:

1. Introduction of canonical representatives FunN

2. Subtyping by using wildcards

3. Currying by introduction of type-casts

Possible but not beautiful!

Martin Plumicke Functional Interfaces vs. Function Types in Java

Page 54: Functional Interfaces vs. Function Types in Java with Lambdaspl/talks/ATPS_14_slides.pdf · Java 8:[Goetz 2013: State of the Lambda]: I Lambdas with functional interfaces as target

IntroductionFunctional interfaces vs. function-types

Proposal: functional interfaces and function-typesConclusion and Outlook

Proposal: functional interfaces and function-types

I Lambda expressions as in Java 8

I Function-types as types of lambda expressions, as in JavaλI Functional interfaces as target types as in Java 8

I An evaluation-operator that allows to apply a lambda expression toits arguments, directly.

Martin Plumicke Functional Interfaces vs. Function Types in Java

Page 55: Functional Interfaces vs. Function Types in Java with Lambdaspl/talks/ATPS_14_slides.pdf · Java 8:[Goetz 2013: State of the Lambda]: I Lambdas with functional interfaces as target

IntroductionFunctional interfaces vs. function-types

Proposal: functional interfaces and function-typesConclusion and Outlook

Discussion

The approach leads to solutions for two Goetz’s problems:

Mixture of structural and nominal types:Each structural type (τ1, . . . , τn)→ τ is equivalent to an nominaltype Funn<τ, τ1, . . . , τn> .

Divergence of library style:Furthermore functional interfaces can be used as library arguments.

The others problems:

Unwieldy syntax: Since the introduction of wildcards the syntax isalready unwieldy.It can be solved by introduction of complete type inference.

Erasures limit overloading of generic function types: This problem is alsogiven by using functional interfaces FunN <a, a1, . . . , aN>

Martin Plumicke Functional Interfaces vs. Function Types in Java

Page 56: Functional Interfaces vs. Function Types in Java with Lambdaspl/talks/ATPS_14_slides.pdf · Java 8:[Goetz 2013: State of the Lambda]: I Lambdas with functional interfaces as target

IntroductionFunctional interfaces vs. function-types

Proposal: functional interfaces and function-typesConclusion and Outlook

Discussion

The approach leads to solutions for two Goetz’s problems:

Mixture of structural and nominal types:Each structural type (τ1, . . . , τn)→ τ is equivalent to an nominaltype Funn<τ, τ1, . . . , τn> .

Divergence of library style:Furthermore functional interfaces can be used as library arguments.

The others problems:

Unwieldy syntax: Since the introduction of wildcards the syntax isalready unwieldy.It can be solved by introduction of complete type inference.

Erasures limit overloading of generic function types: This problem is alsogiven by using functional interfaces FunN <a, a1, . . . , aN>

Martin Plumicke Functional Interfaces vs. Function Types in Java

Page 57: Functional Interfaces vs. Function Types in Java with Lambdaspl/talks/ATPS_14_slides.pdf · Java 8:[Goetz 2013: State of the Lambda]: I Lambdas with functional interfaces as target

IntroductionFunctional interfaces vs. function-types

Proposal: functional interfaces and function-typesConclusion and Outlook

Discussion

The approach leads to solutions for two Goetz’s problems:

Mixture of structural and nominal types:Each structural type (τ1, . . . , τn)→ τ is equivalent to an nominaltype Funn<τ, τ1, . . . , τn> .

Divergence of library style:Furthermore functional interfaces can be used as library arguments.

The others problems:

Unwieldy syntax: Since the introduction of wildcards the syntax isalready unwieldy.It can be solved by introduction of complete type inference.

Erasures limit overloading of generic function types: This problem is alsogiven by using functional interfaces FunN <a, a1, . . . , aN>

Martin Plumicke Functional Interfaces vs. Function Types in Java

Page 58: Functional Interfaces vs. Function Types in Java with Lambdaspl/talks/ATPS_14_slides.pdf · Java 8:[Goetz 2013: State of the Lambda]: I Lambdas with functional interfaces as target

IntroductionFunctional interfaces vs. function-types

Proposal: functional interfaces and function-typesConclusion and Outlook

Lambda expressions in other object-oriented languages

Scala:

Subtyping of function-types: OK (declaration of type parameters ascontravariant, covariant)

Direct evaluation of lambda expressions: OK (apply-method)

C#:

Subtyping of function-types: OK (declaration of type parameters ascontravariant, covariant)

Direct evaluation of lambda expressions: no

C++:

Subtyping of function-types: noDirect evaluation of lambda expressions: OK

Martin Plumicke Functional Interfaces vs. Function Types in Java

Page 59: Functional Interfaces vs. Function Types in Java with Lambdaspl/talks/ATPS_14_slides.pdf · Java 8:[Goetz 2013: State of the Lambda]: I Lambdas with functional interfaces as target

IntroductionFunctional interfaces vs. function-types

Proposal: functional interfaces and function-typesConclusion and Outlook

Lambda expressions in other object-oriented languages

Scala:

Subtyping of function-types: OK (declaration of type parameters ascontravariant, covariant)

Direct evaluation of lambda expressions: OK (apply-method)

C#:

Subtyping of function-types: OK (declaration of type parameters ascontravariant, covariant)

Direct evaluation of lambda expressions: no

C++:

Subtyping of function-types: noDirect evaluation of lambda expressions: OK

Martin Plumicke Functional Interfaces vs. Function Types in Java

Page 60: Functional Interfaces vs. Function Types in Java with Lambdaspl/talks/ATPS_14_slides.pdf · Java 8:[Goetz 2013: State of the Lambda]: I Lambdas with functional interfaces as target

IntroductionFunctional interfaces vs. function-types

Proposal: functional interfaces and function-typesConclusion and Outlook

Lambda expressions in other object-oriented languages

Scala:

Subtyping of function-types: OK (declaration of type parameters ascontravariant, covariant)

Direct evaluation of lambda expressions: OK (apply-method)

C#:

Subtyping of function-types: OK (declaration of type parameters ascontravariant, covariant)

Direct evaluation of lambda expressions: no

C++:

Subtyping of function-types: noDirect evaluation of lambda expressions: OK

Martin Plumicke Functional Interfaces vs. Function Types in Java

Page 61: Functional Interfaces vs. Function Types in Java with Lambdaspl/talks/ATPS_14_slides.pdf · Java 8:[Goetz 2013: State of the Lambda]: I Lambdas with functional interfaces as target

IntroductionFunctional interfaces vs. function-types

Proposal: functional interfaces and function-typesConclusion and Outlook

Conclusion and Outlook

ConclusionI Lambda expressions in Java 8

I Equivalence class of the compatible target types of a lambdaexpression and a canonical representative

I Function-types vs. functional interfacesI SubtypingI Direct evaluation of lambda expressions

I Proposal: Function-types and functional interfaces in Java

OutlookI Implementation of the Proposal

I Consideration of overloading of generic function types

Martin Plumicke Functional Interfaces vs. Function Types in Java

Page 62: Functional Interfaces vs. Function Types in Java with Lambdaspl/talks/ATPS_14_slides.pdf · Java 8:[Goetz 2013: State of the Lambda]: I Lambdas with functional interfaces as target

IntroductionFunctional interfaces vs. function-types

Proposal: functional interfaces and function-typesConclusion and Outlook

Conclusion and Outlook

ConclusionI Lambda expressions in Java 8

I Equivalence class of the compatible target types of a lambdaexpression and a canonical representative

I Function-types vs. functional interfacesI SubtypingI Direct evaluation of lambda expressions

I Proposal: Function-types and functional interfaces in Java

OutlookI Implementation of the Proposal

I Consideration of overloading of generic function types

Martin Plumicke Functional Interfaces vs. Function Types in Java