91
Polymorphic Symmetric Multiple Dispatch with Variance * Gyunghee Park §‡ Jaemin Hong § Guy L. Steele Jr. Sukyoung Ryu § KAIST, Republic of Korea Oracle Labs, USA *Proceedings of the 46th ACM SIGPLAN Symposium on Principles of Programming Languages (POPL '19) This work has received funding from National Research Foundation of Korea (NRF) (Grants NRF-2017R1A2B3012020 and 2017M3C4A7068177)

Polymorphic Symmetric Multiple Dispatch with VariancePolymorphic Symmetric Multiple Dispatch with Variance* Gyunghee Park ‡ Jaemin Hong Guy L. Steele Jr.‡ Sukyoung Ryu‡ KAIST,

  • Upload
    others

  • View
    12

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Polymorphic Symmetric Multiple Dispatch with VariancePolymorphic Symmetric Multiple Dispatch with Variance* Gyunghee Park ‡ Jaemin Hong Guy L. Steele Jr.‡ Sukyoung Ryu‡ KAIST,

Polymorphic Symmetric Multiple Dispatch with Variance*¶

Gyunghee Park§‡

Jaemin Hong§

Guy L. Steele Jr.‡

Sukyoung Ryu‡

§KAIST, Republic of Korea ‡Oracle Labs, USA *Proceedings of the 46th ACM SIGPLAN Symposium on Principles of Programming Languages (POPL '19) ¶This work has received funding from National Research Foundation of Korea (NRF) (Grants NRF-2017R1A2B3012020 and 2017M3C4A7068177)

Page 2: Polymorphic Symmetric Multiple Dispatch with VariancePolymorphic Symmetric Multiple Dispatch with Variance* Gyunghee Park ‡ Jaemin Hong Guy L. Steele Jr.‡ Sukyoung Ryu‡ KAIST,

/ 91!2

class Matrix

add(m: Matrix): Matrix = ...

end

class SparseMatrix extends Matrix

end

m: Matrix = Matrix()

sm: SparseMatrix = SparseMatrix()

m.add(sm)

Page 3: Polymorphic Symmetric Multiple Dispatch with VariancePolymorphic Symmetric Multiple Dispatch with Variance* Gyunghee Park ‡ Jaemin Hong Guy L. Steele Jr.‡ Sukyoung Ryu‡ KAIST,

/ 91!3

Method overloading

class Matrix

add(m: Matrix): Matrix = ...

add(m: SparseMatrix): Matrix = ...

end

class SparseMatrix extends Matrix

end

m: Matrix = Matrix()

sm: SparseMatrix = SparseMatrix()

m.add(sm)

Method dispatch

Page 4: Polymorphic Symmetric Multiple Dispatch with VariancePolymorphic Symmetric Multiple Dispatch with Variance* Gyunghee Park ‡ Jaemin Hong Guy L. Steele Jr.‡ Sukyoung Ryu‡ KAIST,

/ 91!4

Method overloading

class Matrix

add(m: Matrix): Matrix = ...

add(m: SparseMatrix): Matrix = ...

end

class SparseMatrix extends Matrix

add(m: Matrix): Matrix = ...

end

m: Matrix = Matrix()

sm: SparseMatrix = SparseMatrix()

sm.add(m)

Method dispatch

Page 5: Polymorphic Symmetric Multiple Dispatch with VariancePolymorphic Symmetric Multiple Dispatch with Variance* Gyunghee Park ‡ Jaemin Hong Guy L. Steele Jr.‡ Sukyoung Ryu‡ KAIST,

/ 91!5

Method overloading

class Matrix

add(m: Matrix): Matrix = ...

add(m: SparseMatrix): Matrix = ...

end

class SparseMatrix extends Matrix

add(m: Matrix): Matrix = ...

end

m: Matrix = Matrix()

sm: Matrix = SparseMatrix()

sm.add(m)

Method dispatch

Page 6: Polymorphic Symmetric Multiple Dispatch with VariancePolymorphic Symmetric Multiple Dispatch with Variance* Gyunghee Park ‡ Jaemin Hong Guy L. Steele Jr.‡ Sukyoung Ryu‡ KAIST,

/ 91!6

Method overloading

class Matrix

add(m: Matrix): Matrix = ...

add(m: SparseMatrix): Matrix = ...

end

class SparseMatrix extends Matrix

add(m: Matrix): Matrix = ...

end

m: Matrix = Matrix()

sm: Matrix = SparseMatrix()

sm.add(m)

Dynamic

Method dispatch

Page 7: Polymorphic Symmetric Multiple Dispatch with VariancePolymorphic Symmetric Multiple Dispatch with Variance* Gyunghee Park ‡ Jaemin Hong Guy L. Steele Jr.‡ Sukyoung Ryu‡ KAIST,

/ 91!7

Method overloading

class Matrix

add(m: Matrix): Matrix = ...

add(m: SparseMatrix): Matrix = ...

end

class SparseMatrix extends Matrix

add(m: Matrix): Matrix = ...

end

m: Matrix = Matrix()

sm: Matrix = SparseMatrix()

m.add(sm)

Method dispatch

Page 8: Polymorphic Symmetric Multiple Dispatch with VariancePolymorphic Symmetric Multiple Dispatch with Variance* Gyunghee Park ‡ Jaemin Hong Guy L. Steele Jr.‡ Sukyoung Ryu‡ KAIST,

/ 91!8

Method overloading

class Matrix

add(m: Matrix): Matrix = ...

add(m: SparseMatrix): Matrix = ...

end

class SparseMatrix extends Matrix

add(m: Matrix): Matrix = ...

end

m: Matrix = Matrix()

sm: Matrix = SparseMatrix()

m.add(sm)

Single

Method dispatch

Page 9: Polymorphic Symmetric Multiple Dispatch with VariancePolymorphic Symmetric Multiple Dispatch with Variance* Gyunghee Park ‡ Jaemin Hong Guy L. Steele Jr.‡ Sukyoung Ryu‡ KAIST,

/ 91!9

class Matrix

add(m: Matrix): Matrix = ...

add(m: SparseMatrix): Matrix = ...

end

class SparseMatrix extends Matrix

add(m: Matrix): Matrix = ...

end

m: Matrix = Matrix()

sm: Matrix = SparseMatrix()

m.add(sm)

Method overloading

Method dispatch

Single

Page 10: Polymorphic Symmetric Multiple Dispatch with VariancePolymorphic Symmetric Multiple Dispatch with Variance* Gyunghee Park ‡ Jaemin Hong Guy L. Steele Jr.‡ Sukyoung Ryu‡ KAIST,

/ 91!10

class Matrix

add(m: Matrix): Matrix = ...

add(m: SparseMatrix): Matrix = ...

end

class SparseMatrix extends Matrix

add(m: Matrix): Matrix = ...

end

m: Matrix = Matrix()

sm: Matrix = SparseMatrix()

m.add(sm)

Method overloading

The binary method problem

Method dispatch

Single

Page 11: Polymorphic Symmetric Multiple Dispatch with VariancePolymorphic Symmetric Multiple Dispatch with Variance* Gyunghee Park ‡ Jaemin Hong Guy L. Steele Jr.‡ Sukyoung Ryu‡ KAIST,

/ 91!11

Odersky et al., Programming in Scala (3rd Ed.), Artima

Page 12: Polymorphic Symmetric Multiple Dispatch with VariancePolymorphic Symmetric Multiple Dispatch with Variance* Gyunghee Park ‡ Jaemin Hong Guy L. Steele Jr.‡ Sukyoung Ryu‡ KAIST,

/ 91!12

Odersky et al., Programming in Scala (3rd Ed.), Artima

class Point(val x: Int, val y: Int) { override def equals(other: Any) = other match {

}

} class ColoredPoint(x: Int, y: Int, val color: Color.Value) extends Point(x, y) { override def equals(other: Any) = other match {

}

}

Page 13: Polymorphic Symmetric Multiple Dispatch with VariancePolymorphic Symmetric Multiple Dispatch with Variance* Gyunghee Park ‡ Jaemin Hong Guy L. Steele Jr.‡ Sukyoung Ryu‡ KAIST,

/ 91!13

class Point(val x: Int, val y: Int) { override def equals(other: Any) = other match { case that: Point => (that canEqual this) && (this.x == that.x) && (this.y == that.y) case _ => false } def canEqual(other: Any) = other.isInstanceOf[Point] } class ColoredPoint(x: Int, y: Int, val color: Color.Value) extends Point(x, y) { override def equals(other: Any) = other match { case that: ColoredPoint => (that canEqual this) && super.equals(that) && this.color == that.color case _ => false } override def canEqual(other: Any) = other.isInstanceOf[ColoredPoint] }

Odersky et al., Programming in Scala (3rd Ed.), Artima

Page 14: Polymorphic Symmetric Multiple Dispatch with VariancePolymorphic Symmetric Multiple Dispatch with Variance* Gyunghee Park ‡ Jaemin Hong Guy L. Steele Jr.‡ Sukyoung Ryu‡ KAIST,

/ 91!14

class Matrix

add(m: Matrix): Matrix = ...

add(m: SparseMatrix): Matrix = ...

end

class SparseMatrix extends Matrix

add(m: Matrix): Matrix = ...

end

m: Matrix = Matrix()

sm: Matrix = SparseMatrix()

m.add(sm)

Method dispatch

Page 15: Polymorphic Symmetric Multiple Dispatch with VariancePolymorphic Symmetric Multiple Dispatch with Variance* Gyunghee Park ‡ Jaemin Hong Guy L. Steele Jr.‡ Sukyoung Ryu‡ KAIST,

/ 91!15

class Matrix

add(m: Matrix): Matrix = ...

add(m: SparseMatrix): Matrix = ...

end

class SparseMatrix extends Matrix

add(m: Matrix): Matrix = ...

end

m: Matrix = Matrix()

sm: Matrix = SparseMatrix()

m.add(sm)

Multiple

Method dispatch

Page 16: Polymorphic Symmetric Multiple Dispatch with VariancePolymorphic Symmetric Multiple Dispatch with Variance* Gyunghee Park ‡ Jaemin Hong Guy L. Steele Jr.‡ Sukyoung Ryu‡ KAIST,

/ 91!16

class Matrix

add(m: Matrix): Matrix = ...

add(m: SparseMatrix): Matrix = ...

end

class SparseMatrix extends Matrix

add(m: Matrix): Matrix = ...

end

m: Matrix = Matrix()

sm: Matrix = SparseMatrix()

m.add(sm)

Multiple

Method dispatch

Symmetric

Page 17: Polymorphic Symmetric Multiple Dispatch with VariancePolymorphic Symmetric Multiple Dispatch with Variance* Gyunghee Park ‡ Jaemin Hong Guy L. Steele Jr.‡ Sukyoung Ryu‡ KAIST,

/ 91!17

class Matrix

add(m: Matrix): Matrix = ...

add(m: SparseMatrix): Matrix = ...

end

class SparseMatrix extends Matrix

add(m: Matrix): Matrix = ...

end

m: Matrix = Matrix()

sm: Matrix = SparseMatrix()

m.add(sm)

Multiple

Method dispatch

Symmetric

Page 18: Polymorphic Symmetric Multiple Dispatch with VariancePolymorphic Symmetric Multiple Dispatch with Variance* Gyunghee Park ‡ Jaemin Hong Guy L. Steele Jr.‡ Sukyoung Ryu‡ KAIST,

/ 91!18

class Matrix

add(m: Matrix): Matrix = ...

add(m: SparseMatrix): Matrix = ...

end

class SparseMatrix extends Matrix

add(m: Matrix): Matrix = ...

end

m: Matrix = Matrix()

sm: Matrix = SparseMatrix()

m.add(sm) Dynamic languages

Multiple

Method dispatch

Symmetric

Page 19: Polymorphic Symmetric Multiple Dispatch with VariancePolymorphic Symmetric Multiple Dispatch with Variance* Gyunghee Park ‡ Jaemin Hong Guy L. Steele Jr.‡ Sukyoung Ryu‡ KAIST,

/ 91!19

class Matrix

add(m: Matrix): Matrix = ...

add(m: SparseMatrix): Matrix = ...

end

class SparseMatrix extends Matrix

add(m: Matrix): Matrix = ...

end

m: Matrix = SparseMatrix()

sm: SparseMatrix = SparseMatrix()

sm.add(m)

Compile time

Page 20: Polymorphic Symmetric Multiple Dispatch with VariancePolymorphic Symmetric Multiple Dispatch with Variance* Gyunghee Park ‡ Jaemin Hong Guy L. Steele Jr.‡ Sukyoung Ryu‡ KAIST,

/ 91!20

Run time

class Matrix

add(m: Matrix): Matrix = ...

add(m: SparseMatrix): Matrix = ...

end

class SparseMatrix extends Matrix

add(m: Matrix): Matrix = ...

end

m: Matrix = SparseMatrix()

sm: SparseMatrix = SparseMatrix()

sm.add(m)

Page 21: Polymorphic Symmetric Multiple Dispatch with VariancePolymorphic Symmetric Multiple Dispatch with Variance* Gyunghee Park ‡ Jaemin Hong Guy L. Steele Jr.‡ Sukyoung Ryu‡ KAIST,

/ 91!21

class Matrix

add(m: Matrix): Matrix = ...

add(m: SparseMatrix): Matrix = ...

end

class SparseMatrix extends Matrix

add(m: Matrix): Matrix = ...

end

m: Matrix = SparseMatrix()

sm: SparseMatrix = SparseMatrix()

sm.add(m)

(Matrix, SparseMatrix)

(SparseMatrix, Matrix)

<:

<:

sm.add(m)

Run time

Page 22: Polymorphic Symmetric Multiple Dispatch with VariancePolymorphic Symmetric Multiple Dispatch with Variance* Gyunghee Park ‡ Jaemin Hong Guy L. Steele Jr.‡ Sukyoung Ryu‡ KAIST,

/ 91!22

class Matrix

add(m: Matrix): Matrix = ...

add(m: SparseMatrix): Matrix = ...

end

class SparseMatrix extends Matrix

add(m: Matrix): Matrix = ...

end

m: Matrix = SparseMatrix()

sm: SparseMatrix = SparseMatrix()

sm.add(m) Ambiguous method calls

Run time

(Matrix, SparseMatrix)

(SparseMatrix, Matrix)

<:

<:

sm.add(m)

Page 23: Polymorphic Symmetric Multiple Dispatch with VariancePolymorphic Symmetric Multiple Dispatch with Variance* Gyunghee Park ‡ Jaemin Hong Guy L. Steele Jr.‡ Sukyoung Ryu‡ KAIST,

/ 91!23

Compile time

class Matrix

add(m: Matrix): SparseMatrix = ...

add(m: SparseMatrix): Matrix = ...

end

class SparseMatrix extends Matrix

numOfNonzeroEntries(): Int = ...

end

m: Matrix = Matrix()

sm: Matrix = SparseMatrix()

m.add(sm).numOfNonzeroEntries()

Page 24: Polymorphic Symmetric Multiple Dispatch with VariancePolymorphic Symmetric Multiple Dispatch with Variance* Gyunghee Park ‡ Jaemin Hong Guy L. Steele Jr.‡ Sukyoung Ryu‡ KAIST,

/ 91!24

Run time

class Matrix

add(m: Matrix): SparseMatrix = ...

add(m: SparseMatrix): Matrix = ...

end

class SparseMatrix extends Matrix

numOfNonzeroEntries(): Int = ...

end

m: Matrix = Matrix()

sm: Matrix = SparseMatrix()

m.add(sm).numOfNonzeroEntries()

Page 25: Polymorphic Symmetric Multiple Dispatch with VariancePolymorphic Symmetric Multiple Dispatch with Variance* Gyunghee Park ‡ Jaemin Hong Guy L. Steele Jr.‡ Sukyoung Ryu‡ KAIST,

/ 91!25

class Matrix

add(m: Matrix): SparseMatrix = ...

add(m: SparseMatrix): Matrix = ...

end

class SparseMatrix extends Matrix

numOfNonzeroEntries(): Int = ...

end

m: Matrix = Matrix()

sm: Matrix = SparseMatrix()

m.add(sm).numOfNonzeroEntries().numOfNonzeroEntries()

Matrix

Run time

Page 26: Polymorphic Symmetric Multiple Dispatch with VariancePolymorphic Symmetric Multiple Dispatch with Variance* Gyunghee Park ‡ Jaemin Hong Guy L. Steele Jr.‡ Sukyoung Ryu‡ KAIST,

/ 91!26

class Matrix

add(m: Matrix): SparseMatrix = ...

add(m: SparseMatrix): Matrix = ...

end

class SparseMatrix extends Matrix

numOfNonzeroEntries(): Int = ...

end

m: Matrix = Matrix()

sm: Matrix = SparseMatrix()

m.add(sm).numOfNonzeroEntries()

Broken type preservation

Run time

.numOfNonzeroEntries()

Matrix

Page 27: Polymorphic Symmetric Multiple Dispatch with VariancePolymorphic Symmetric Multiple Dispatch with Variance* Gyunghee Park ‡ Jaemin Hong Guy L. Steele Jr.‡ Sukyoung Ryu‡ KAIST,

/ 91!27

Compile time

Overloading rules

add(m: Matrix, m: Matrix): Matrix = ...

add(m: Matrix, m: SparseMatrix): Matrix = ...

add(m: SparseMatrix, m: SparseMatrix): SparseMatrix = ...

...

Page 28: Polymorphic Symmetric Multiple Dispatch with VariancePolymorphic Symmetric Multiple Dispatch with Variance* Gyunghee Park ‡ Jaemin Hong Guy L. Steele Jr.‡ Sukyoung Ryu‡ KAIST,

/ 91!28

add1

add2

add3

add4

adds

Run timeCompile time

Overloading rules

add(m: Matrix, m: Matrix): Matrix = ...

add(m: Matrix, m: SparseMatrix): Matrix = ...

add(m: SparseMatrix, m: SparseMatrix): SparseMatrix = ...

...

Page 29: Polymorphic Symmetric Multiple Dispatch with VariancePolymorphic Symmetric Multiple Dispatch with Variance* Gyunghee Park ‡ Jaemin Hong Guy L. Steele Jr.‡ Sukyoung Ryu‡ KAIST,

/ 91!29

add1

add2

add3

add4

<:

<:<:

(parameter type)

Unambiguity

adds

Run timeCompile time

Overloading rules

add(m: Matrix, m: Matrix): Matrix = ...

add(m: Matrix, m: SparseMatrix): Matrix = ...

add(m: SparseMatrix, m: SparseMatrix): SparseMatrix = ...

...

Page 30: Polymorphic Symmetric Multiple Dispatch with VariancePolymorphic Symmetric Multiple Dispatch with Variance* Gyunghee Park ‡ Jaemin Hong Guy L. Steele Jr.‡ Sukyoung Ryu‡ KAIST,

/ 91!30

Overloading rules

add1

add2

add3

add4

<:

<:<:

(parameter type)

Unambiguity

adds

<:

(return type)

Type Preservation

Run timeCompile time

add(m: Matrix, m: Matrix): Matrix = ...

add(m: Matrix, m: SparseMatrix): Matrix = ...

add(m: SparseMatrix, m: SparseMatrix): SparseMatrix = ...

...

Page 31: Polymorphic Symmetric Multiple Dispatch with VariancePolymorphic Symmetric Multiple Dispatch with Variance* Gyunghee Park ‡ Jaemin Hong Guy L. Steele Jr.‡ Sukyoung Ryu‡ KAIST,

/ 91!31

applicableSet(d) = {T : d is applicable to T}

Types2

applicableSet(d1)

(Matrix, Matrix)

(Matrix, SparseMatrix)

...

(Object, Object) (String, Matrix)

...

Allen et al., Type Checking Modular Multiple Dispatch with Parametric Polymorphism and Multiple Inheritance, OOPSLA '11

m1 :add(m: Matrix, m: Matrix): Matrix = ...d1 :

Page 32: Polymorphic Symmetric Multiple Dispatch with VariancePolymorphic Symmetric Multiple Dispatch with Variance* Gyunghee Park ‡ Jaemin Hong Guy L. Steele Jr.‡ Sukyoung Ryu‡ KAIST,

/ 91!32

d2 ⊑ d1 iff applicableSet(d2) ⊆ applicableSet(d1)

m1 :

applicableSet(d2)

(Matrix, Matrix)

(Matrix, SparseMatrix)

...

...

add(m: Matrix, m: Matrix): Matrix = ...

add(m: Matrix, m: SparseMatrix): Matrix = ...

is more specific than

d2 :

applicableSet(d1)

d1 :

Allen et al., Type Checking Modular Multiple Dispatch with Parametric Polymorphism and Multiple Inheritance, OOPSLA '11

Page 33: Polymorphic Symmetric Multiple Dispatch with VariancePolymorphic Symmetric Multiple Dispatch with Variance* Gyunghee Park ‡ Jaemin Hong Guy L. Steele Jr.‡ Sukyoung Ryu‡ KAIST,

/ 91!33

Overloading rules 1. No duplicates rule 2. Meet rule 3. Return type rule

add1

add2

add3

add4

Unambiguity

adds(return type)

Type Preservation

Run timeCompile time

add(m: Matrix, m: Matrix): Matrix = ...

add(m: Matrix, m: SparseMatrix): Matrix = ...

add(m: SparseMatrix, m: SparseMatrix): SparseMatrix = ...

...

⊑⊑

<:

Allen et al., Type Checking Modular Multiple Dispatch with Parametric Polymorphism and Multiple Inheritance, OOPSLA '11

Page 34: Polymorphic Symmetric Multiple Dispatch with VariancePolymorphic Symmetric Multiple Dispatch with Variance* Gyunghee Park ‡ Jaemin Hong Guy L. Steele Jr.‡ Sukyoung Ryu‡ KAIST,

/ 91!34

d1 = d2 ⇒ d1 = d2

No duplicates rule

Page 35: Polymorphic Symmetric Multiple Dispatch with VariancePolymorphic Symmetric Multiple Dispatch with Variance* Gyunghee Park ‡ Jaemin Hong Guy L. Steele Jr.‡ Sukyoung Ryu‡ KAIST,

/ 91!35

class Matrix

add(m: Matrix): Matrix = ...

add(m: Matrix): Matrix = ...

end

d1 = d2 ⇒ d1 = d2

No duplicates rule

Page 36: Polymorphic Symmetric Multiple Dispatch with VariancePolymorphic Symmetric Multiple Dispatch with Variance* Gyunghee Park ‡ Jaemin Hong Guy L. Steele Jr.‡ Sukyoung Ryu‡ KAIST,

/ 91!36

class Matrix

add(m: Matrix): Matrix = ...

end

d1 = d2 ⇒ d1 = d2

No duplicates rule

Page 37: Polymorphic Symmetric Multiple Dispatch with VariancePolymorphic Symmetric Multiple Dispatch with Variance* Gyunghee Park ‡ Jaemin Hong Guy L. Steele Jr.‡ Sukyoung Ryu‡ KAIST,

/ 91!37

d1

Meet rule

d3 d2

Page 38: Polymorphic Symmetric Multiple Dispatch with VariancePolymorphic Symmetric Multiple Dispatch with Variance* Gyunghee Park ‡ Jaemin Hong Guy L. Steele Jr.‡ Sukyoung Ryu‡ KAIST,

/ 91!38

class Matrix

add(m: SparseMatrix): Matrix = ...

end

class SparseMatrix extends Matrix

add(m: Matrix): Matrix = ...

end

d1

Meet rule

d3 d2

Page 39: Polymorphic Symmetric Multiple Dispatch with VariancePolymorphic Symmetric Multiple Dispatch with Variance* Gyunghee Park ‡ Jaemin Hong Guy L. Steele Jr.‡ Sukyoung Ryu‡ KAIST,

/ 91!39

class Matrix

add(m: SparseMatrix): Matrix = ...

end

class SparseMatrix extends Matrix

add(m: Matrix): Matrix = ...

add(m: SparseMatrix): Matrix = ...

end

d1

Meet rule

d3 d2

Page 40: Polymorphic Symmetric Multiple Dispatch with VariancePolymorphic Symmetric Multiple Dispatch with Variance* Gyunghee Park ‡ Jaemin Hong Guy L. Steele Jr.‡ Sukyoung Ryu‡ KAIST,

/ 91!40

Return type rule

⇒T2

d1

d2

T1

<:

Return types

Page 41: Polymorphic Symmetric Multiple Dispatch with VariancePolymorphic Symmetric Multiple Dispatch with Variance* Gyunghee Park ‡ Jaemin Hong Guy L. Steele Jr.‡ Sukyoung Ryu‡ KAIST,

/ 91!41

class Matrix

add(m: Matrix): SparseMatrix = ...

add(m: SparseMatrix): Matrix = ...

end

class SparseMatrix extends Matrix

endReturn type rule

⇒T2

d1

d2

T1

<:

Return types

Page 42: Polymorphic Symmetric Multiple Dispatch with VariancePolymorphic Symmetric Multiple Dispatch with Variance* Gyunghee Park ‡ Jaemin Hong Guy L. Steele Jr.‡ Sukyoung Ryu‡ KAIST,

/ 91!42

class Matrix

add(m: Matrix): Matrix = ...

add(m: SparseMatrix): Matrix = ...

end

class SparseMatrix extends Matrix

endReturn type rule

⇒T2

d1

d2

T1

<:

Return types

Page 43: Polymorphic Symmetric Multiple Dispatch with VariancePolymorphic Symmetric Multiple Dispatch with Variance* Gyunghee Park ‡ Jaemin Hong Guy L. Steele Jr.‡ Sukyoung Ryu‡ KAIST,

/ 91!43

add1

add2

add3

add4

adds(return type)

Type Preservation

Run timeCompile time

add(m: Matrix, m: Matrix): Matrix = ...

add(m: Matrix, m: SparseMatrix): Matrix = ...

add(m: SparseMatrix, m: SparseMatrix): SparseMatrix = ...

...

Unambiguity

⊑⊑

<:

⇒T2

d1

d2

T1

<:

Ret ur n t ypes

d1 d3 d2

d1 = d2 ⇒ d1 = d2

Page 44: Polymorphic Symmetric Multiple Dispatch with VariancePolymorphic Symmetric Multiple Dispatch with Variance* Gyunghee Park ‡ Jaemin Hong Guy L. Steele Jr.‡ Sukyoung Ryu‡ KAIST,

/ 91!44

class Array[T] end

makeArray[T](t: T): Array[T] = ...

i: Int = 1

makeArray(i)

Parametric polymorphism

Page 45: Polymorphic Symmetric Multiple Dispatch with VariancePolymorphic Symmetric Multiple Dispatch with Variance* Gyunghee Park ‡ Jaemin Hong Guy L. Steele Jr.‡ Sukyoung Ryu‡ KAIST,

/ 91!45

instances(d1) : makeArray(t: Object): Array[Object] = ...

makeArray(t: String): Array[String] = ...

makeArray(t: Number): Array[Number] = ...

makeArray(t: Int): Array[Int] = ...

...

d1 : makeArray[T](t: T): Array[T] = ...

Allen et al., Type Checking Modular Multiple Dispatch with Parametric Polymorphism and Multiple Inheritance, OOPSLA '11

Page 46: Polymorphic Symmetric Multiple Dispatch with VariancePolymorphic Symmetric Multiple Dispatch with Variance* Gyunghee Park ‡ Jaemin Hong Guy L. Steele Jr.‡ Sukyoung Ryu‡ KAIST,

/ 91!46

applicableSet(d) = {T : ∃D ∈ instances(d) . D is applicable to T}

Types = applicableSet(d1)

Object String

...

Number Int

d1 : makeArray[T](t: T): Array[T] = ...

Allen et al., Type Checking Modular Multiple Dispatch with Parametric Polymorphism and Multiple Inheritance, OOPSLA '11

Page 47: Polymorphic Symmetric Multiple Dispatch with VariancePolymorphic Symmetric Multiple Dispatch with Variance* Gyunghee Park ‡ Jaemin Hong Guy L. Steele Jr.‡ Sukyoung Ryu‡ KAIST,

/ 91!47

makeArray[T](t: T): Array[T] = ...

makeArray(i: Number): Array[Number] = ...d2 :

applicableSet(d2)

applicableSet(d1)Object String

...

Number Int...

d2 ⊑ d1 iff applicableSet(d2) ⊆ applicableSet(d1)is more specific than

d1 :

Allen et al., Type Checking Modular Multiple Dispatch with Parametric Polymorphism and Multiple Inheritance, OOPSLA '11

Page 48: Polymorphic Symmetric Multiple Dispatch with VariancePolymorphic Symmetric Multiple Dispatch with Variance* Gyunghee Park ‡ Jaemin Hong Guy L. Steele Jr.‡ Sukyoung Ryu‡ KAIST,

/ 91!48

d1

Meet rule

d3 d2d1 = d2 ⇒ d1 = d2

No duplicates rule

Page 49: Polymorphic Symmetric Multiple Dispatch with VariancePolymorphic Symmetric Multiple Dispatch with Variance* Gyunghee Park ‡ Jaemin Hong Guy L. Steele Jr.‡ Sukyoung Ryu‡ KAIST,

/ 91!49

class Array[T] end

makeArray[T](t: T): Array[T] = ...

makeArray(i: Number): Array[Number] = ...

Return type rule

⇒T2

d1

d2

T1

<:

Return types

Page 50: Polymorphic Symmetric Multiple Dispatch with VariancePolymorphic Symmetric Multiple Dispatch with Variance* Gyunghee Park ‡ Jaemin Hong Guy L. Steele Jr.‡ Sukyoung Ryu‡ KAIST,

/ 91!50

Return type rule

⇒T2

d1

d2

T1

<:

Return types

class Array[T] end

makeArray[T](t: T): Array[T] = ...

makeArray(i: Number): Array[Number] = ...

i: Object = 1

a: Array[Object] = makeArray(i)

a[0] = "1"

Compile time

Page 51: Polymorphic Symmetric Multiple Dispatch with VariancePolymorphic Symmetric Multiple Dispatch with Variance* Gyunghee Park ‡ Jaemin Hong Guy L. Steele Jr.‡ Sukyoung Ryu‡ KAIST,

/ 91!51

Return type rule

⇒T2

d1

d2

T1

<:

Return types

class Array[T] end

makeArray[T](t: T): Array[T] = ...

makeArray(i: Number): Array[Number] = ...

i: Object = 1

a: Array[Object] = makeArray(i)

a[0] = "1"

Run time

Page 52: Polymorphic Symmetric Multiple Dispatch with VariancePolymorphic Symmetric Multiple Dispatch with Variance* Gyunghee Park ‡ Jaemin Hong Guy L. Steele Jr.‡ Sukyoung Ryu‡ KAIST,

/ 91!52

class Array[T] end

makeArray[T](t: T): Array[T] = ...

makeArray(i: Number): Array[Number] = ...

Return type rule

⇒T2

d1

d2

T1

<:

Ret . types

T

∈App . to T

d1

d2

Page 53: Polymorphic Symmetric Multiple Dispatch with VariancePolymorphic Symmetric Multiple Dispatch with Variance* Gyunghee Park ‡ Jaemin Hong Guy L. Steele Jr.‡ Sukyoung Ryu‡ KAIST,

/ 91!53

class Array[T] end

makeArray[T](t: T): Array[T] = ...

makeArray(i: Number): Array[Number] = ...

⇒T2

T1

<:

Ret . types

T

∈App . to T

Int

Return type rule

d1

d2

d1

d2

Page 54: Polymorphic Symmetric Multiple Dispatch with VariancePolymorphic Symmetric Multiple Dispatch with Variance* Gyunghee Park ‡ Jaemin Hong Guy L. Steele Jr.‡ Sukyoung Ryu‡ KAIST,

/ 91!54

class Array[T] end

makeArray[T](t: T): Array[T] = ...

makeArray(i: Number): Array[Number] = ...

⇒T2

T1

<:

Ret . types

T

∈App . to T

Int

makeArray(i: Object): Array[Object] = ...

Return type rule

d1

d2

d1

d2

Page 55: Polymorphic Symmetric Multiple Dispatch with VariancePolymorphic Symmetric Multiple Dispatch with Variance* Gyunghee Park ‡ Jaemin Hong Guy L. Steele Jr.‡ Sukyoung Ryu‡ KAIST,

/ 91!55

class Array[T] end

makeArray[T](t: T): Array[T] = ...

makeArray(i: Number): Array[Number] = ...

⇒T2

T1

<:

Ret . types

T

∈App . to T

Int

makeArray(i: Object): Array[Object] = ...

Array[Object]

Return type rule

d1

d2

d1

d2

Page 56: Polymorphic Symmetric Multiple Dispatch with VariancePolymorphic Symmetric Multiple Dispatch with Variance* Gyunghee Park ‡ Jaemin Hong Guy L. Steele Jr.‡ Sukyoung Ryu‡ KAIST,

/ 91!56

class Array[T] end

makeArray[T](t: T): Array[T] = ...

makeArray(i: Number): Array[Number] = ...

⇒T2

T1

<:

Ret . types

T

∈App . to T

Int

makeArray(i: Object): Array[Object] = ...

Array[Object]

Return type rule

d1

d2

d1

d2

Page 57: Polymorphic Symmetric Multiple Dispatch with VariancePolymorphic Symmetric Multiple Dispatch with Variance* Gyunghee Park ‡ Jaemin Hong Guy L. Steele Jr.‡ Sukyoung Ryu‡ KAIST,

/ 91!57

class Array[T] end

makeArray[T](t: T): Array[T] = ...

makeArray(i: Number): Array[Number] = ...

⇒T2

T1

<:

Ret . types

T

∈App . to T

Int

makeArray(i: Object): Array[Object] = ...

makeArray(i: Number): Array[Number] = ...

Array[Object]

/∃

Return type rule

d1

d2

d1

d2

Page 58: Polymorphic Symmetric Multiple Dispatch with VariancePolymorphic Symmetric Multiple Dispatch with Variance* Gyunghee Park ‡ Jaemin Hong Guy L. Steele Jr.‡ Sukyoung Ryu‡ KAIST,

/ 91!58

⇒T2

T1

<:

Ret . types

T

∈App . to T

class Array[T] end

makeArray[T](t: T): Array[T] = ...

makeArray[T](i: Number): Array[T] = ...

Return type rule

d1

d2

d1

d2

Page 59: Polymorphic Symmetric Multiple Dispatch with VariancePolymorphic Symmetric Multiple Dispatch with Variance* Gyunghee Park ‡ Jaemin Hong Guy L. Steele Jr.‡ Sukyoung Ryu‡ KAIST,

/ 91!59

class Array[T] end

makeArray[T](t: T): Array[T] = ...

makeArray[T](i: Number): Array[T] = ...

⇒T2

T1

<:

Ret . types

T

∈App . to T

Int

makeArray(i: Object): Array[Object] = ...

makeArray[T](i: Number): Array[T] = ...

Array[Object]

makeArray(i: Number): Array[Object] = ...Return type rule

d1

d2

d1

d2

Page 60: Polymorphic Symmetric Multiple Dispatch with VariancePolymorphic Symmetric Multiple Dispatch with Variance* Gyunghee Park ‡ Jaemin Hong Guy L. Steele Jr.‡ Sukyoung Ryu‡ KAIST,

/ 91!60

d1

d2

d1

d2

Return type rule

class Array[T] end

makeArray[T](t: T): Array[T] = ...

makeArray[T](i: Number): Array[T] = ...

⇒T2

T1

<:

Ret . types

T

∈App . to T

Int

makeArray(i: Object): Array[Object] = ...

makeArray[T](i: Number): Array[T] = ...

Array[Object]

makeArray(i: Number): Array[Object] = ...

T

Object

A dynamic dispatch algorithmneeds statically determined return types

Page 61: Polymorphic Symmetric Multiple Dispatch with VariancePolymorphic Symmetric Multiple Dispatch with Variance* Gyunghee Park ‡ Jaemin Hong Guy L. Steele Jr.‡ Sukyoung Ryu‡ KAIST,

/ 91!61

add1

add2

add3

add4

adds: T(return type)

Type Preservation

Run timeCompile time

makeArray[T](t: T): Array[T] = ...

makeArray(t: Number): Array[Number] = ...

makeArray[T](i: Number): Array[T] = ...

...

Unambiguity

⊑⊑

<:

d1 d3 d2

d1 = d2 ⇒ d1 = d2

⇒T2

T1

<:

Ret . t ypes

T

∈App . to T

d1

d2

d1

d2

Page 62: Polymorphic Symmetric Multiple Dispatch with VariancePolymorphic Symmetric Multiple Dispatch with Variance* Gyunghee Park ‡ Jaemin Hong Guy L. Steele Jr.‡ Sukyoung Ryu‡ KAIST,

/ 91!62

FGFV Calculus

Page 63: Polymorphic Symmetric Multiple Dispatch with VariancePolymorphic Symmetric Multiple Dispatch with Variance* Gyunghee Park ‡ Jaemin Hong Guy L. Steele Jr.‡ Sukyoung Ryu‡ KAIST,

/ 91!63

FGFV CalculusMultiple inheritance

Page 64: Polymorphic Symmetric Multiple Dispatch with VariancePolymorphic Symmetric Multiple Dispatch with Variance* Gyunghee Park ‡ Jaemin Hong Guy L. Steele Jr.‡ Sukyoung Ryu‡ KAIST,

/ 91!64

FGFV CalculusMultiple inheritance

Parametric polymorphism

Page 65: Polymorphic Symmetric Multiple Dispatch with VariancePolymorphic Symmetric Multiple Dispatch with Variance* Gyunghee Park ‡ Jaemin Hong Guy L. Steele Jr.‡ Sukyoung Ryu‡ KAIST,

/ 91!65

FGFV CalculusMultiple inheritance

Parametric polymorphismVariance

Page 66: Polymorphic Symmetric Multiple Dispatch with VariancePolymorphic Symmetric Multiple Dispatch with Variance* Gyunghee Park ‡ Jaemin Hong Guy L. Steele Jr.‡ Sukyoung Ryu‡ KAIST,

/ 91!66

FGFV CalculusMultiple inheritance

Parametric polymorphismVariance

class A[+T] end

class A[=T] end

class A[-T] end

A[T] <: A[S] iff T <: S

A[T] <: A[S] iff T ≡ S

A[T] <: A[S] iff T :> S

Page 67: Polymorphic Symmetric Multiple Dispatch with VariancePolymorphic Symmetric Multiple Dispatch with Variance* Gyunghee Park ‡ Jaemin Hong Guy L. Steele Jr.‡ Sukyoung Ryu‡ KAIST,

/ 91!67

d1 : add(m: Matrix, m: Matrix): Matrix = ...

makeArray[T](t: T): Array[T] = ...d2 :

dom(d1) = ∃[](Matrix, Matrix)dom(d2) = ∃[T <: Object](T)

arrow(d1) = ∀[](Matrix, Matrix) → Matrixarrow(d2) = ∀[T <: Object](T) → Array[T]

Page 68: Polymorphic Symmetric Multiple Dispatch with VariancePolymorphic Symmetric Multiple Dispatch with Variance* Gyunghee Park ‡ Jaemin Hong Guy L. Steele Jr.‡ Sukyoung Ryu‡ KAIST,

/ 91!68

d1 = d2 ⇒ d1 = d2

No duplicates rule

Page 69: Polymorphic Symmetric Multiple Dispatch with VariancePolymorphic Symmetric Multiple Dispatch with Variance* Gyunghee Park ‡ Jaemin Hong Guy L. Steele Jr.‡ Sukyoung Ryu‡ KAIST,

/ 91!69

d1

Meet rule

d3 d2

Page 70: Polymorphic Symmetric Multiple Dispatch with VariancePolymorphic Symmetric Multiple Dispatch with Variance* Gyunghee Park ‡ Jaemin Hong Guy L. Steele Jr.‡ Sukyoung Ryu‡ KAIST,

/ 91!70

⇒T2

T1

<:

Ret . types

T

∈App . to T

Return type rule

d1

d2

d1

d2

Page 71: Polymorphic Symmetric Multiple Dispatch with VariancePolymorphic Symmetric Multiple Dispatch with Variance* Gyunghee Park ‡ Jaemin Hong Guy L. Steele Jr.‡ Sukyoung Ryu‡ KAIST,

/ 91!71

Run timeCompile time

d1 d3 d2

d1 = d2 ⇒ d1 = d2

⇒T2

T1

<:

Ret . t ypes

T

App . to T

d1

d2

d1

d2

d2

d5

d1

d4

d6 d7

⊑ ⊑

⊑ ⊑ ⊑d3

m(e)

Page 72: Polymorphic Symmetric Multiple Dispatch with VariancePolymorphic Symmetric Multiple Dispatch with Variance* Gyunghee Park ‡ Jaemin Hong Guy L. Steele Jr.‡ Sukyoung Ryu‡ KAIST,

/ 91!72

Run timeCompile time

d1 d3 d2

d1 = d2 ⇒ d1 = d2

⇒T2

T1

<:

Ret . t ypes

T

App . to T

d1

d2

d1

d2

d2

d5

d1

d4

d6 d7

⊑ ⊑

⊑ ⊑ ⊑d3

m(e)

Page 73: Polymorphic Symmetric Multiple Dispatch with VariancePolymorphic Symmetric Multiple Dispatch with Variance* Gyunghee Park ‡ Jaemin Hong Guy L. Steele Jr.‡ Sukyoung Ryu‡ KAIST,

/ 91!73

Run timeCompile time

d1 d3 d2

d1 = d2 ⇒ d1 = d2

⇒T2

T1

<:

Ret . t ypes

T

App . to T

d1

d2

d1

d2

d2

d5

d1

d4

d6 d7

⊑ ⊑

⊑ ⊑ ⊑d3

m(e)

d2 d5d1 d4 d6 d7d3

Page 74: Polymorphic Symmetric Multiple Dispatch with VariancePolymorphic Symmetric Multiple Dispatch with Variance* Gyunghee Park ‡ Jaemin Hong Guy L. Steele Jr.‡ Sukyoung Ryu‡ KAIST,

/ 91!74

Run timeCompile time

d1 d3 d2

d1 = d2 ⇒ d1 = d2

⇒T2

T1

<:

Ret . t ypes

T

App . to T

d1

d2

d1

d2

d2

d5

d1

d4

d6 d7

⊑ ⊑

⊑ ⊑ ⊑d3

m(e)

d2 d5d1 d4 d6 d7d3

m(a): Tr

Page 75: Polymorphic Symmetric Multiple Dispatch with VariancePolymorphic Symmetric Multiple Dispatch with Variance* Gyunghee Park ‡ Jaemin Hong Guy L. Steele Jr.‡ Sukyoung Ryu‡ KAIST,

/ 91!75

Run timeCompile time

d1 d3 d2

d1 = d2 ⇒ d1 = d2

⇒T2

T1

<:

Ret . t ypes

T

App . to T

d1

d2

d1

d2

d2

d5

d1

d4

d6 d7

⊑ ⊑

⊑ ⊑ ⊑d3

m(e)

d2 d5d1 d4 d6 d7d3

m(v): Tr

Ta

Dispatch

Match

MatchSolve

:

<:

<:

Page 76: Polymorphic Symmetric Multiple Dispatch with VariancePolymorphic Symmetric Multiple Dispatch with Variance* Gyunghee Park ‡ Jaemin Hong Guy L. Steele Jr.‡ Sukyoung Ryu‡ KAIST,

/ 91!76

Run timeCompile time

d1 d3 d2

d1 = d2 ⇒ d1 = d2

⇒T2

T1

<:

Ret . t ypes

T

App . to T

d1

d2

d1

d2

d2

d5

d1

d4

d6 d7

⊑ ⊑

⊑ ⊑ ⊑d3

m(e)

d2 d5d1 d4 d6 d7d3

m(v): Tr

Ta

Dispatch

Match

Match

m[P](Sa): Sr Solve

:

<:

<:

Page 77: Polymorphic Symmetric Multiple Dispatch with VariancePolymorphic Symmetric Multiple Dispatch with Variance* Gyunghee Park ‡ Jaemin Hong Guy L. Steele Jr.‡ Sukyoung Ryu‡ KAIST,

/ 91!77

Run timeCompile time

d1 d3 d2

d1 = d2 ⇒ d1 = d2

⇒T2

T1

<:

Ret . t ypes

T

App . to T

d1

d2

d1

d2

d2

d5

d1

d4

d6 d7

⊑ ⊑

⊑ ⊑ ⊑d3

m(e)

d2 d5d1 d4 d6 d7d3

m(v): Tr

Ta

Dispatch

Match

Match

m[P](Sa): Sr Solve

:

<:

<:

Page 78: Polymorphic Symmetric Multiple Dispatch with VariancePolymorphic Symmetric Multiple Dispatch with Variance* Gyunghee Park ‡ Jaemin Hong Guy L. Steele Jr.‡ Sukyoung Ryu‡ KAIST,

/ 91!78

Run timeCompile time

d1 d3 d2

d1 = d2 ⇒ d1 = d2

⇒T2

T1

<:

Ret . t ypes

T

App . to T

d1

d2

d1

d2

d2

d5

d1

d4

d6 d7

⊑ ⊑

⊑ ⊑ ⊑d3

m(e)

d2 d5d1 d4 d6 d7d3

m(v): Tr

Ta

Dispatch

Match

Match

m[P](Sa): Sr Solve

:

<:

<:

Page 79: Polymorphic Symmetric Multiple Dispatch with VariancePolymorphic Symmetric Multiple Dispatch with Variance* Gyunghee Park ‡ Jaemin Hong Guy L. Steele Jr.‡ Sukyoung Ryu‡ KAIST,

/ 91!79

Run timeCompile time

d1 d3 d2

d1 = d2 ⇒ d1 = d2

⇒T2

T1

<:

Ret . t ypes

T

App . to T

d1

d2

d1

d2

d2

d5

d1

d4

d6 d7

⊑ ⊑

⊑ ⊑ ⊑d3

m(e)

d2 d5d1 d4 d6 d7d3

m(v): Tr

Ta

Dispatch

Match

Match

m[P](Sa): Sr Solve

:

<:

<:

Page 80: Polymorphic Symmetric Multiple Dispatch with VariancePolymorphic Symmetric Multiple Dispatch with Variance* Gyunghee Park ‡ Jaemin Hong Guy L. Steele Jr.‡ Sukyoung Ryu‡ KAIST,

/ 91!80

Run timeCompile time

d1 d3 d2

d1 = d2 ⇒ d1 = d2

⇒T2

T1

<:

Ret . t ypes

T

App . to T

d1

d2

d1

d2

d2

d5

d1

d4

d6 d7

⊑ ⊑

⊑ ⊑ ⊑d3

m(e)

d2 d5d1 d4 d6 d7d3

m(v): Tr

Ta

Dispatch

Match

Match

m[P](Sa): Sr Solve

:

<:

<:

P=T

[T/P] d1

Page 81: Polymorphic Symmetric Multiple Dispatch with VariancePolymorphic Symmetric Multiple Dispatch with Variance* Gyunghee Park ‡ Jaemin Hong Guy L. Steele Jr.‡ Sukyoung Ryu‡ KAIST,

/ 91!81

Run timeCompile time

d1 d3 d2

d1 = d2 ⇒ d1 = d2

⇒T2

T1

<:

Ret . t ypes

T

App . to T

d1

d2

d1

d2

d2

d5

d1

d4

d6 d7

⊑ ⊑

⊑ ⊑ ⊑d3

m(e)

d2 d5d1 d4 d6 d7d3

m(v): Tr

Ta

Dispatch

Match

Match

m[P](Sa): Sr Solve

:

<:

<:

Page 82: Polymorphic Symmetric Multiple Dispatch with VariancePolymorphic Symmetric Multiple Dispatch with Variance* Gyunghee Park ‡ Jaemin Hong Guy L. Steele Jr.‡ Sukyoung Ryu‡ KAIST,

/ 91!82

Run timeCompile time

d1 d3 d2

d1 = d2 ⇒ d1 = d2

⇒T2

T1

<:

Ret . t ypes

T

App . to T

d1

d2

d1

d2

makeArray(i)

makeArray[T](t: T): Array[T] = ...

makeArray[T](i: Number): Array[T] = ...

makeArray[T](i: Number): Array[T] makeArray[T](t: T): Array[T]

Page 83: Polymorphic Symmetric Multiple Dispatch with VariancePolymorphic Symmetric Multiple Dispatch with Variance* Gyunghee Park ‡ Jaemin Hong Guy L. Steele Jr.‡ Sukyoung Ryu‡ KAIST,

/ 91!83

Run timeCompile time

d1 d3 d2

d1 = d2 ⇒ d1 = d2

⇒T2

T1

<:

Ret . t ypes

T

App . to T

d1

d2

d1

d2

d2 d5d1 d4 d6 d7d3

makeArray(i): Array[Object]makeArray(i)

makeArray[T](t: T): Array[T] = ...

makeArray[T](i: Number): Array[T] = ...

makeArray[T](i: Number): Array[T] makeArray[T](t: T): Array[T]

Page 84: Polymorphic Symmetric Multiple Dispatch with VariancePolymorphic Symmetric Multiple Dispatch with Variance* Gyunghee Park ‡ Jaemin Hong Guy L. Steele Jr.‡ Sukyoung Ryu‡ KAIST,

/ 91!84

Run timeCompile time

d1 d3 d2

d1 = d2 ⇒ d1 = d2

⇒T2

T1

<:

Ret . t ypes

T

App . to T

d1

d2

d1

d2

d2 d5d1 d4 d6 d7d3

makeArray(1): Array[Object]makeArray(i)

makeArray[T](t: T): Array[T] = ...

makeArray[T](i: Number): Array[T] = ...

makeArray[T](i: Number): Array[T] makeArray[T](t: T): Array[T]

Int

:

Page 85: Polymorphic Symmetric Multiple Dispatch with VariancePolymorphic Symmetric Multiple Dispatch with Variance* Gyunghee Park ‡ Jaemin Hong Guy L. Steele Jr.‡ Sukyoung Ryu‡ KAIST,

/ 91!85

Run timeCompile time

d1 d3 d2

d1 = d2 ⇒ d1 = d2

⇒T2

T1

<:

Ret . t ypes

T

App . to T

d1

d2

d1

d2

Dispatch

Match

Match

[T](Number): Array[T]Solve

<:

<:

d4d3

makeArray(1): Array[Object]makeArray(i)

makeArray[T](t: T): Array[T] = ...

makeArray[T](i: Number): Array[T] = ...

makeArray[T](i: Number): Array[T] makeArray[T](t: T): Array[T]

Int

:

Page 86: Polymorphic Symmetric Multiple Dispatch with VariancePolymorphic Symmetric Multiple Dispatch with Variance* Gyunghee Park ‡ Jaemin Hong Guy L. Steele Jr.‡ Sukyoung Ryu‡ KAIST,

/ 91!86

[T](Number): Array[T]

d4d3

makeArray(1): Array[Object]makeArray(i)

makeArray[T](t: T): Array[T] = ...

makeArray[T](i: Number): Array[T] = ...

makeArray[T](i: Number): Array[T] makeArray[T](t: T): Array[T]

Int

:

Run timeCompile time

d1 d3 d2

d1 = d2 ⇒ d1 = d2

⇒T2

T1

<:

Ret . t ypes

T

App . to T

d1

d2

d1

d2

Dispatch

Match

MatchSolve

<:

<:

{}

Page 87: Polymorphic Symmetric Multiple Dispatch with VariancePolymorphic Symmetric Multiple Dispatch with Variance* Gyunghee Park ‡ Jaemin Hong Guy L. Steele Jr.‡ Sukyoung Ryu‡ KAIST,

/ 91!87

[T](Number): Array[T]

d4d3

makeArray(1): Array[Object]makeArray(i)

makeArray[T](t: T): Array[T] = ...

makeArray[T](i: Number): Array[T] = ...

makeArray[T](i: Number): Array[T] makeArray[T](t: T): Array[T]

Int

:

Run timeCompile time

d1 d3 d2

d1 = d2 ⇒ d1 = d2

⇒T2

T1

<:

Ret . t ypes

T

App . to T

d1

d2

d1

d2

Dispatch

Match

MatchSolve

<:

<:

{}

{T=Object}

Page 88: Polymorphic Symmetric Multiple Dispatch with VariancePolymorphic Symmetric Multiple Dispatch with Variance* Gyunghee Park ‡ Jaemin Hong Guy L. Steele Jr.‡ Sukyoung Ryu‡ KAIST,

/ 91!88

[T](Number): Array[T]

d4d3

makeArray(1): Array[Object]makeArray(i)

makeArray[T](t: T): Array[T] = ...

makeArray[T](i: Number): Array[T] = ...

makeArray[T](i: Number): Array[T] makeArray[T](t: T): Array[T]

Int

:

Run timeCompile time

d1 d3 d2

d1 = d2 ⇒ d1 = d2

⇒T2

T1

<:

Ret . t ypes

T

App . to T

d1

d2

d1

d2

Dispatch

Match

MatchSolve

<:

<:

{}

{T=Object}

{}

Page 89: Polymorphic Symmetric Multiple Dispatch with VariancePolymorphic Symmetric Multiple Dispatch with Variance* Gyunghee Park ‡ Jaemin Hong Guy L. Steele Jr.‡ Sukyoung Ryu‡ KAIST,

/ 91!89

[T](Number): Array[T]

d4d3

makeArray(1): Array[Object]makeArray(i)

makeArray[T](t: T): Array[T] = ...

makeArray[T](i: Number): Array[T] = ...

makeArray[T](i: Number): Array[T] makeArray[T](t: T): Array[T]

Int

:

Run timeCompile time

d1 d3 d2

d1 = d2 ⇒ d1 = d2

⇒T2

T1

<:

Ret . t ypes

T

App . to T

d1

d2

d1

d2

Dispatch

Match

MatchSolve

<:

<:

{}

{T=Object}

{}

T=Object

Page 90: Polymorphic Symmetric Multiple Dispatch with VariancePolymorphic Symmetric Multiple Dispatch with Variance* Gyunghee Park ‡ Jaemin Hong Guy L. Steele Jr.‡ Sukyoung Ryu‡ KAIST,

/ 91!90

TheoremA well-formed program never results in an ambiguous method call.

TheoremA well-formed program never results in a type error.

Page 91: Polymorphic Symmetric Multiple Dispatch with VariancePolymorphic Symmetric Multiple Dispatch with Variance* Gyunghee Park ‡ Jaemin Hong Guy L. Steele Jr.‡ Sukyoung Ryu‡ KAIST,

/ 91!91

Run timeCompile time

d1 d3 d2

d1 = d2 ⇒ d1 = d2

⇒T2

T1

<:

Ret . t ypes

T

App . to T

d1

d2

d1

d2

d2

d5

d1

d4

d6 d7

⊑ ⊑

⊑ ⊑ ⊑d3

m(e)

d2 d5d1 d4 d6 d7d3

m(v): Tr

Ta

Dispatch

Match

Match

m[P](Sa): Sr Solve

:

<:

<:

P=T

[T/P] d1