Polymorphic Symmetric Multiple Dispatch with VariancePolymorphic Symmetric Multiple Dispatch with...
Transcript of Polymorphic Symmetric Multiple Dispatch with VariancePolymorphic Symmetric Multiple Dispatch with...
![Page 1: Polymorphic Symmetric Multiple Dispatch with VariancePolymorphic Symmetric Multiple Dispatch with Variance* Gyunghee Park ‡ Jaemin Hong Guy L. Steele Jr.‡ Sukyoung Ryu‡ KAIST,](https://reader033.fdocuments.us/reader033/viewer/2022051815/60404fd75446a0335b16149a/html5/thumbnails/1.jpg)
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,](https://reader033.fdocuments.us/reader033/viewer/2022051815/60404fd75446a0335b16149a/html5/thumbnails/2.jpg)
/ 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,](https://reader033.fdocuments.us/reader033/viewer/2022051815/60404fd75446a0335b16149a/html5/thumbnails/3.jpg)
/ 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,](https://reader033.fdocuments.us/reader033/viewer/2022051815/60404fd75446a0335b16149a/html5/thumbnails/4.jpg)
/ 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,](https://reader033.fdocuments.us/reader033/viewer/2022051815/60404fd75446a0335b16149a/html5/thumbnails/5.jpg)
/ 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,](https://reader033.fdocuments.us/reader033/viewer/2022051815/60404fd75446a0335b16149a/html5/thumbnails/6.jpg)
/ 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,](https://reader033.fdocuments.us/reader033/viewer/2022051815/60404fd75446a0335b16149a/html5/thumbnails/7.jpg)
/ 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,](https://reader033.fdocuments.us/reader033/viewer/2022051815/60404fd75446a0335b16149a/html5/thumbnails/8.jpg)
/ 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,](https://reader033.fdocuments.us/reader033/viewer/2022051815/60404fd75446a0335b16149a/html5/thumbnails/9.jpg)
/ 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,](https://reader033.fdocuments.us/reader033/viewer/2022051815/60404fd75446a0335b16149a/html5/thumbnails/10.jpg)
/ 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,](https://reader033.fdocuments.us/reader033/viewer/2022051815/60404fd75446a0335b16149a/html5/thumbnails/11.jpg)
/ 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,](https://reader033.fdocuments.us/reader033/viewer/2022051815/60404fd75446a0335b16149a/html5/thumbnails/12.jpg)
/ 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,](https://reader033.fdocuments.us/reader033/viewer/2022051815/60404fd75446a0335b16149a/html5/thumbnails/13.jpg)
/ 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,](https://reader033.fdocuments.us/reader033/viewer/2022051815/60404fd75446a0335b16149a/html5/thumbnails/14.jpg)
/ 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,](https://reader033.fdocuments.us/reader033/viewer/2022051815/60404fd75446a0335b16149a/html5/thumbnails/15.jpg)
/ 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,](https://reader033.fdocuments.us/reader033/viewer/2022051815/60404fd75446a0335b16149a/html5/thumbnails/16.jpg)
/ 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,](https://reader033.fdocuments.us/reader033/viewer/2022051815/60404fd75446a0335b16149a/html5/thumbnails/17.jpg)
/ 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,](https://reader033.fdocuments.us/reader033/viewer/2022051815/60404fd75446a0335b16149a/html5/thumbnails/18.jpg)
/ 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,](https://reader033.fdocuments.us/reader033/viewer/2022051815/60404fd75446a0335b16149a/html5/thumbnails/19.jpg)
/ 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,](https://reader033.fdocuments.us/reader033/viewer/2022051815/60404fd75446a0335b16149a/html5/thumbnails/20.jpg)
/ 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,](https://reader033.fdocuments.us/reader033/viewer/2022051815/60404fd75446a0335b16149a/html5/thumbnails/21.jpg)
/ 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,](https://reader033.fdocuments.us/reader033/viewer/2022051815/60404fd75446a0335b16149a/html5/thumbnails/22.jpg)
/ 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,](https://reader033.fdocuments.us/reader033/viewer/2022051815/60404fd75446a0335b16149a/html5/thumbnails/23.jpg)
/ 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,](https://reader033.fdocuments.us/reader033/viewer/2022051815/60404fd75446a0335b16149a/html5/thumbnails/24.jpg)
/ 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,](https://reader033.fdocuments.us/reader033/viewer/2022051815/60404fd75446a0335b16149a/html5/thumbnails/25.jpg)
/ 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,](https://reader033.fdocuments.us/reader033/viewer/2022051815/60404fd75446a0335b16149a/html5/thumbnails/26.jpg)
/ 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,](https://reader033.fdocuments.us/reader033/viewer/2022051815/60404fd75446a0335b16149a/html5/thumbnails/27.jpg)
/ 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,](https://reader033.fdocuments.us/reader033/viewer/2022051815/60404fd75446a0335b16149a/html5/thumbnails/28.jpg)
/ 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,](https://reader033.fdocuments.us/reader033/viewer/2022051815/60404fd75446a0335b16149a/html5/thumbnails/29.jpg)
/ 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,](https://reader033.fdocuments.us/reader033/viewer/2022051815/60404fd75446a0335b16149a/html5/thumbnails/30.jpg)
/ 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,](https://reader033.fdocuments.us/reader033/viewer/2022051815/60404fd75446a0335b16149a/html5/thumbnails/31.jpg)
/ 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,](https://reader033.fdocuments.us/reader033/viewer/2022051815/60404fd75446a0335b16149a/html5/thumbnails/32.jpg)
/ 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,](https://reader033.fdocuments.us/reader033/viewer/2022051815/60404fd75446a0335b16149a/html5/thumbnails/33.jpg)
/ 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,](https://reader033.fdocuments.us/reader033/viewer/2022051815/60404fd75446a0335b16149a/html5/thumbnails/34.jpg)
/ 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,](https://reader033.fdocuments.us/reader033/viewer/2022051815/60404fd75446a0335b16149a/html5/thumbnails/35.jpg)
/ 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,](https://reader033.fdocuments.us/reader033/viewer/2022051815/60404fd75446a0335b16149a/html5/thumbnails/36.jpg)
/ 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,](https://reader033.fdocuments.us/reader033/viewer/2022051815/60404fd75446a0335b16149a/html5/thumbnails/37.jpg)
/ 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,](https://reader033.fdocuments.us/reader033/viewer/2022051815/60404fd75446a0335b16149a/html5/thumbnails/38.jpg)
/ 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,](https://reader033.fdocuments.us/reader033/viewer/2022051815/60404fd75446a0335b16149a/html5/thumbnails/39.jpg)
/ 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,](https://reader033.fdocuments.us/reader033/viewer/2022051815/60404fd75446a0335b16149a/html5/thumbnails/40.jpg)
/ 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,](https://reader033.fdocuments.us/reader033/viewer/2022051815/60404fd75446a0335b16149a/html5/thumbnails/41.jpg)
/ 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,](https://reader033.fdocuments.us/reader033/viewer/2022051815/60404fd75446a0335b16149a/html5/thumbnails/42.jpg)
/ 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,](https://reader033.fdocuments.us/reader033/viewer/2022051815/60404fd75446a0335b16149a/html5/thumbnails/43.jpg)
/ 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,](https://reader033.fdocuments.us/reader033/viewer/2022051815/60404fd75446a0335b16149a/html5/thumbnails/44.jpg)
/ 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,](https://reader033.fdocuments.us/reader033/viewer/2022051815/60404fd75446a0335b16149a/html5/thumbnails/45.jpg)
/ 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,](https://reader033.fdocuments.us/reader033/viewer/2022051815/60404fd75446a0335b16149a/html5/thumbnails/46.jpg)
/ 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,](https://reader033.fdocuments.us/reader033/viewer/2022051815/60404fd75446a0335b16149a/html5/thumbnails/47.jpg)
/ 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,](https://reader033.fdocuments.us/reader033/viewer/2022051815/60404fd75446a0335b16149a/html5/thumbnails/48.jpg)
/ 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,](https://reader033.fdocuments.us/reader033/viewer/2022051815/60404fd75446a0335b16149a/html5/thumbnails/49.jpg)
/ 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,](https://reader033.fdocuments.us/reader033/viewer/2022051815/60404fd75446a0335b16149a/html5/thumbnails/50.jpg)
/ 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,](https://reader033.fdocuments.us/reader033/viewer/2022051815/60404fd75446a0335b16149a/html5/thumbnails/51.jpg)
/ 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,](https://reader033.fdocuments.us/reader033/viewer/2022051815/60404fd75446a0335b16149a/html5/thumbnails/52.jpg)
/ 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,](https://reader033.fdocuments.us/reader033/viewer/2022051815/60404fd75446a0335b16149a/html5/thumbnails/53.jpg)
/ 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,](https://reader033.fdocuments.us/reader033/viewer/2022051815/60404fd75446a0335b16149a/html5/thumbnails/54.jpg)
/ 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,](https://reader033.fdocuments.us/reader033/viewer/2022051815/60404fd75446a0335b16149a/html5/thumbnails/55.jpg)
/ 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,](https://reader033.fdocuments.us/reader033/viewer/2022051815/60404fd75446a0335b16149a/html5/thumbnails/56.jpg)
/ 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,](https://reader033.fdocuments.us/reader033/viewer/2022051815/60404fd75446a0335b16149a/html5/thumbnails/57.jpg)
/ 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,](https://reader033.fdocuments.us/reader033/viewer/2022051815/60404fd75446a0335b16149a/html5/thumbnails/58.jpg)
/ 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,](https://reader033.fdocuments.us/reader033/viewer/2022051815/60404fd75446a0335b16149a/html5/thumbnails/59.jpg)
/ 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,](https://reader033.fdocuments.us/reader033/viewer/2022051815/60404fd75446a0335b16149a/html5/thumbnails/60.jpg)
/ 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,](https://reader033.fdocuments.us/reader033/viewer/2022051815/60404fd75446a0335b16149a/html5/thumbnails/61.jpg)
/ 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,](https://reader033.fdocuments.us/reader033/viewer/2022051815/60404fd75446a0335b16149a/html5/thumbnails/62.jpg)
/ 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,](https://reader033.fdocuments.us/reader033/viewer/2022051815/60404fd75446a0335b16149a/html5/thumbnails/63.jpg)
/ 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,](https://reader033.fdocuments.us/reader033/viewer/2022051815/60404fd75446a0335b16149a/html5/thumbnails/64.jpg)
/ 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,](https://reader033.fdocuments.us/reader033/viewer/2022051815/60404fd75446a0335b16149a/html5/thumbnails/65.jpg)
/ 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,](https://reader033.fdocuments.us/reader033/viewer/2022051815/60404fd75446a0335b16149a/html5/thumbnails/66.jpg)
/ 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,](https://reader033.fdocuments.us/reader033/viewer/2022051815/60404fd75446a0335b16149a/html5/thumbnails/67.jpg)
/ 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,](https://reader033.fdocuments.us/reader033/viewer/2022051815/60404fd75446a0335b16149a/html5/thumbnails/68.jpg)
/ 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,](https://reader033.fdocuments.us/reader033/viewer/2022051815/60404fd75446a0335b16149a/html5/thumbnails/69.jpg)
/ 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,](https://reader033.fdocuments.us/reader033/viewer/2022051815/60404fd75446a0335b16149a/html5/thumbnails/70.jpg)
/ 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,](https://reader033.fdocuments.us/reader033/viewer/2022051815/60404fd75446a0335b16149a/html5/thumbnails/71.jpg)
/ 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,](https://reader033.fdocuments.us/reader033/viewer/2022051815/60404fd75446a0335b16149a/html5/thumbnails/72.jpg)
/ 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,](https://reader033.fdocuments.us/reader033/viewer/2022051815/60404fd75446a0335b16149a/html5/thumbnails/73.jpg)
/ 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,](https://reader033.fdocuments.us/reader033/viewer/2022051815/60404fd75446a0335b16149a/html5/thumbnails/74.jpg)
/ 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,](https://reader033.fdocuments.us/reader033/viewer/2022051815/60404fd75446a0335b16149a/html5/thumbnails/75.jpg)
/ 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,](https://reader033.fdocuments.us/reader033/viewer/2022051815/60404fd75446a0335b16149a/html5/thumbnails/76.jpg)
/ 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,](https://reader033.fdocuments.us/reader033/viewer/2022051815/60404fd75446a0335b16149a/html5/thumbnails/77.jpg)
/ 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,](https://reader033.fdocuments.us/reader033/viewer/2022051815/60404fd75446a0335b16149a/html5/thumbnails/78.jpg)
/ 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,](https://reader033.fdocuments.us/reader033/viewer/2022051815/60404fd75446a0335b16149a/html5/thumbnails/79.jpg)
/ 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,](https://reader033.fdocuments.us/reader033/viewer/2022051815/60404fd75446a0335b16149a/html5/thumbnails/80.jpg)
/ 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,](https://reader033.fdocuments.us/reader033/viewer/2022051815/60404fd75446a0335b16149a/html5/thumbnails/81.jpg)
/ 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,](https://reader033.fdocuments.us/reader033/viewer/2022051815/60404fd75446a0335b16149a/html5/thumbnails/82.jpg)
/ 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,](https://reader033.fdocuments.us/reader033/viewer/2022051815/60404fd75446a0335b16149a/html5/thumbnails/83.jpg)
/ 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,](https://reader033.fdocuments.us/reader033/viewer/2022051815/60404fd75446a0335b16149a/html5/thumbnails/84.jpg)
/ 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,](https://reader033.fdocuments.us/reader033/viewer/2022051815/60404fd75446a0335b16149a/html5/thumbnails/85.jpg)
/ 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,](https://reader033.fdocuments.us/reader033/viewer/2022051815/60404fd75446a0335b16149a/html5/thumbnails/86.jpg)
/ 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,](https://reader033.fdocuments.us/reader033/viewer/2022051815/60404fd75446a0335b16149a/html5/thumbnails/87.jpg)
/ 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,](https://reader033.fdocuments.us/reader033/viewer/2022051815/60404fd75446a0335b16149a/html5/thumbnails/88.jpg)
/ 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,](https://reader033.fdocuments.us/reader033/viewer/2022051815/60404fd75446a0335b16149a/html5/thumbnails/89.jpg)
/ 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,](https://reader033.fdocuments.us/reader033/viewer/2022051815/60404fd75446a0335b16149a/html5/thumbnails/90.jpg)
/ 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,](https://reader033.fdocuments.us/reader033/viewer/2022051815/60404fd75446a0335b16149a/html5/thumbnails/91.jpg)
/ 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