1 / 46

Getting F-Bounded Polymorphism into Shape

Getting F-Bounded Polymorphism into Shape. Ben Greenman, Fabian Muehlboeck , and Ross Tate Cornell University. Typesafe Equality + Generic Lists?. ( Typesafe ) Equality. @override public boolean equals(Object other) { if(other instanceof String){…} else { return false; } }.

lirit
Télécharger la présentation

Getting F-Bounded Polymorphism into Shape

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Getting F-Bounded Polymorphism into Shape Ben Greenman, Fabian Muehlboeck, and Ross Tate Cornell University

  2. Typesafe Equality + Generic Lists?

  3. (Typesafe) Equality @override public boolean equals(Object other) { if(other instanceof String){…} else { return false; } } “Hello”.equals(5)

  4. (Typesafe) Equality interface Eq<T> { booleanequalTo(T other); } class String extends Eq<String> { booleanequalTo(String other) {…} … } “Hello”.equalTo(5)

  5. (Typesafe) Equality {“Hello”,”World!”} .equalTo {“Ahoi”,”World!”} {inc,} .equalTo {,id}

  6. Eq List (read-only) contravariant covariant List<out T> Eq<in T> Eq<Object> Eq<String> List<String> List<Object> :> :>

  7. interface List<out T> extends Eq<List<Eq<T>>>

  8. interface List<out T> extends Eq<List<Eq<T>>> Eq<List<Eq<String>>> Eq<List<String>> List<Eq<String>> List<String> List<Eq<String>> List<String> String Eq<String>

  9. Ross Tate, Alan Leung, and Sorin Lerner Taming Wildcards in Java's Type System , PLDI 2011 Andrew J. Kennedy and Benjamin C. Pierce On Decidability of Nominal Subtyping with Variance, FOOL-WOOD 2007 List<T> extends Eq<List<Eq<T>>> List<T> extends Eq<List<Eq<T>>> List<T> extends Eq<List<Eq<T>>> List<T> extends Eq<List<Eq<T>>> Nested Contravariance! List<T> Expansive Inheritance! List<Eq<T>>

  10. Trees class Tree extends List<Tree> Are trees equatable?

  11. Are Trees equatable?

  12. Are Trees equatable? List<Tree> List<Eq<Tree>> Tree Eq<Tree> Eq<List<Eq<Tree>>> Eq<Tree> Tree List<Eq<Tree>>

  13. Meh!

  14. interface List<out T> extends Eq<List<Eq<T>>>

  15. WHY?

  16. interface List<out T> extends Eq<List<Eq<T>>> List<Eq<T>>

  17. How do we use Eq<…>? NOT as type arguments! List<String> List<Eq<…>> With F-bounded polymorphism! NOT for parameters! class String extends Eq<String> class Set<T extends Eq<T>> NOT for return types! NOT for fields! NOT for local variables!

  18. Shapes Materials • Used in • Recursive inheritance definitions • Recursive type variable constraints • Used for • Type arguments • Method parameters • Return types • Fields • Variables • Eq<T> • Comparable<T> • Clonable<T> • Summable<T> • String • List<T> • Throwable • FileStream

  19. All Sheep in Scotland are black

  20. Read these 13 million lines of Code! Can I script it? NO! I mean… YES!

  21. Survey 13.5 million lines of open-source generic Java code from 60 projects taken primarily from the Qualitas Corpus* No class was ever both a shape and a material • - Type arguments • - Method parameters • - Return types • - Fields & Variables Recursive - inheritancedefinitions - type variable constraints *http://qualitascorpus.com

  22. Material-Shape Separation Thou shalt not mix shapes and materials!

  23. Shapes Materials • Used in • Recursive inheritance definitions • Recursive type variable constraints • Used for • Type arguments • Method parameters • Fields • Variables Recursive inheritance only through Shapes Well-founded inheritance

  24. Well-founded Material Inheritance Materials class A extends B<C>, D<E> {…} Inheritance hierarchies defined independent of A

  25. Well-founded Material Inheritance class A extends B {…} class B extends A {…} class A extends List<B> {…} class B extends List<A> {…}

  26. Decidable Subtyping • With naïve algorithms • Proven with a simple measure

  27. Decidable Subtyping material interface Pred<in T> material interface Matrix<out T> extends List<List<T>>

  28. Decidable Subtyping

  29. Decidable Subtyping

  30. Decidable Subtyping A<T> extends B<C<T>> Inheritance well-founded  measure function terminates

  31. Decidable Subtyping A<in T> extends Eq<A<List<T>>> A<in T> extends Eq<A<List<T>>> No Shapes in here All Materials

  32. Joins Most precise common supertype String Integer = ? someBool ? 42 : “Hello”

  33. Joins Integer extends Clonable<Integer> String extends Clonable<String> String Integer = ? Clonable<Object> Clonable<Clonable<Object>> Clonable<Clonable<Clonable<Object>>>

  34. Computable Material Joins Integer extends Clonable<Integer> String extends Clonable<String> String Integer = ? someBool ? 42 : “Hello” Materials only: Object

  35. MaterialJoins A<T> extends C<T> B<T> extends C<E<T>> A<> B<’> C<> C<E<’>> Finite due to well-founded material inheritance C<…> Recursion on and E<’> Recursion on and E<’>

  36. Higher Kinds

  37. Conditional Inheritance

  38. Decidable Subtyping Computable Joins Higher Kinds Material-Shape Separation

More Related