composing and decomposing data types
play

Composing and Decomposing Data Types Data Types ` a la Carte with - PowerPoint PPT Presentation

u n i v e r s i t y o f c o p e n h a g e n d e p a r t m e n t o f c o m p u t e r s c i e n c e Faculty of Science Composing and Decomposing Data Types Data Types ` a la Carte with Closed Type Families Patrick Bahr University of Copenhagen,


  1. u n i v e r s i t y o f c o p e n h a g e n d e p a r t m e n t o f c o m p u t e r s c i e n c e Contributions We re-implemented : ≺ : such that: • Subtyping behaves as intuitively expected • Ambiguous subtyping are avoided • We can express isomorphism : ≃ : Patrick Bahr — Composing and Decomposing Data Types — 20th June, 2014 Slide 6

  2. u n i v e r s i t y o f c o p e n h a g e n d e p a r t m e n t o f c o m p u t e r s c i e n c e Improved subtyping constraint : ≺ : Subtyping : ≺ : behaves as intuitively expected Patrick Bahr — Composing and Decomposing Data Types — 20th June, 2014 Slide 7

  3. u n i v e r s i t y o f c o p e n h a g e n d e p a r t m e n t o f c o m p u t e r s c i e n c e Improved subtyping constraint : ≺ : Subtyping : ≺ : behaves as intuitively expected f : ≺ : g ⇐ ⇒ “set of signatures in f ” ⊆ “set of signatures in g ” Patrick Bahr — Composing and Decomposing Data Types — 20th June, 2014 Slide 7

  4. u n i v e r s i t y o f c o p e n h a g e n d e p a r t m e n t o f c o m p u t e r s c i e n c e Improved subtyping constraint : ≺ : Subtyping : ≺ : behaves as intuitively expected f : ≺ : g ⇐ ⇒ “set of signatures in f ” ⊆ “set of signatures in g ” C :+: A : ≺ : A :+: B :+: C Patrick Bahr — Composing and Decomposing Data Types — 20th June, 2014 Slide 7

  5. u n i v e r s i t y o f c o p e n h a g e n d e p a r t m e n t o f c o m p u t e r s c i e n c e Improved subtyping constraint : ≺ : Subtyping : ≺ : behaves as intuitively expected f : ≺ : g ⇐ ⇒ “set of signatures in f ” ⊆ “set of signatures in g ” C :+: A : ≺ : A :+: B :+: C Avoid ambiguous subtyping Multiple occurrences of signatures are rejected: Patrick Bahr — Composing and Decomposing Data Types — 20th June, 2014 Slide 7

  6. u n i v e r s i t y o f c o p e n h a g e n d e p a r t m e n t o f c o m p u t e r s c i e n c e Improved subtyping constraint : ≺ : Subtyping : ≺ : behaves as intuitively expected f : ≺ : g ⇐ ⇒ “set of signatures in f ” ⊆ “set of signatures in g ” C :+: A : ≺ : A :+: B :+: C Avoid ambiguous subtyping Multiple occurrences of signatures are rejected: A : ≺ : A :+: A :+: C A :+: A : ≺ : A :+: B Patrick Bahr — Composing and Decomposing Data Types — 20th June, 2014 Slide 7

  7. u n i v e r s i t y o f c o p e n h a g e n d e p a r t m e n t o f c o m p u t e r s c i e n c e Improved subtyping constraint : ≺ : Subtyping : ≺ : behaves as intuitively expected f : ≺ : g ⇐ ⇒ “set of signatures in f ” ⊆ “set of signatures in g ” C :+: A : ≺ : A :+: B :+: C Avoid ambiguous subtyping injection not unique! Multiple occurrences of signatures are rejected: A : ≺ : A :+: A :+: C A :+: A : ≺ : A :+: B Patrick Bahr — Composing and Decomposing Data Types — 20th June, 2014 Slide 7

  8. u n i v e r s i t y o f c o p e n h a g e n d e p a r t m e n t o f c o m p u t e r s c i e n c e Improved subtyping constraint : ≺ : Subtyping : ≺ : behaves as intuitively expected f : ≺ : g ⇐ ⇒ “set of signatures in f ” ⊆ “set of signatures in g ” C :+: A : ≺ : A :+: B :+: C Avoid ambiguous subtyping injection not unique! Multiple occurrences of signatures are rejected: A : �≺ : A :+: A :+: C A :+: A : ≺ : A :+: B Patrick Bahr — Composing and Decomposing Data Types — 20th June, 2014 Slide 7

  9. u n i v e r s i t y o f c o p e n h a g e n d e p a r t m e n t o f c o m p u t e r s c i e n c e Improved subtyping constraint : ≺ : Subtyping : ≺ : behaves as intuitively expected f : ≺ : g ⇐ ⇒ “set of signatures in f ” ⊆ “set of signatures in g ” C :+: A : ≺ : A :+: B :+: C Avoid ambiguous subtyping injection not unique! Multiple occurrences of signatures are rejected: A : �≺ : A :+: A :+: C A :+: A : ≺ : A :+: B “injection” not injective! Patrick Bahr — Composing and Decomposing Data Types — 20th June, 2014 Slide 7

  10. u n i v e r s i t y o f c o p e n h a g e n d e p a r t m e n t o f c o m p u t e r s c i e n c e Improved subtyping constraint : ≺ : Subtyping : ≺ : behaves as intuitively expected f : ≺ : g ⇐ ⇒ “set of signatures in f ” ⊆ “set of signatures in g ” C :+: A : ≺ : A :+: B :+: C Avoid ambiguous subtyping injection not unique! Multiple occurrences of signatures are rejected: A : �≺ : A :+: A :+: C A :+: A : �≺ : A :+: B “injection” not injective! Patrick Bahr — Composing and Decomposing Data Types — 20th June, 2014 Slide 7

  11. u n i v e r s i t y o f c o p e n h a g e n d e p a r t m e n t o f c o m p u t e r s c i e n c e Type isomorphism constraint : ≃ : We can express isomorphism : ≃ : f : ≃ : g ⇐ ⇒ “set of signatures in f ” = “set of signatures in g ” Patrick Bahr — Composing and Decomposing Data Types — 20th June, 2014 Slide 8

  12. u n i v e r s i t y o f c o p e n h a g e n d e p a r t m e n t o f c o m p u t e r s c i e n c e Type isomorphism constraint : ≃ : We can express isomorphism : ≃ : f : ≃ : g ⇐ ⇒ “set of signatures in f ” = “set of signatures in g ” Easy to implement: f : ≃ : g = ( f : ≺ : g , g : ≺ : f ) Patrick Bahr — Composing and Decomposing Data Types — 20th June, 2014 Slide 8

  13. u n i v e r s i t y o f c o p e n h a g e n d e p a r t m e n t o f c o m p u t e r s c i e n c e Type isomorphism constraint : ≃ : We can express isomorphism : ≃ : f : ≃ : g ⇐ ⇒ “set of signatures in f ” = “set of signatures in g ” Easy to implement: f : ≃ : g = ( f : ≺ : g , g : ≺ : f ) Use case: improved projection function The type of the projection function is unsatisfying: prj :: ( f : ≺ : g ) ⇒ g a → Maybe ( f a ) Patrick Bahr — Composing and Decomposing Data Types — 20th June, 2014 Slide 8

  14. u n i v e r s i t y o f c o p e n h a g e n d e p a r t m e n t o f c o m p u t e r s c i e n c e Type isomorphism constraint : ≃ : We can express isomorphism : ≃ : f : ≃ : g ⇐ ⇒ “set of signatures in f ” = “set of signatures in g ” Easy to implement: f : ≃ : g = ( f : ≺ : g , g : ≺ : f ) Use case: improved projection function The type of the projection function is unsatisfying: prj :: ( f : ≺ : g ) ⇒ g a → Maybe ( f a ) With : ≃ : we can do better: split :: ( g : ≃ : f :+: r ) ⇒ g a → Either ( f a ) ( r a ) Patrick Bahr — Composing and Decomposing Data Types — 20th June, 2014 Slide 8

  15. u n i v e r s i t y o f c o p e n h a g e n d e p a r t m e n t o f c o m p u t e r s c i e n c e Type isomorphism constraint : ≃ : We can express isomorphism : ≃ : f : ≃ : g ⇐ ⇒ “set of signatures in f ” = “set of signatures in g ” Easy to implement: f : ≃ : g = ( f : ≺ : g , g : ≺ : f ) Use case: improved projection function The type of the projection function is unsatisfying: prj :: ( f : ≺ : g ) ⇒ g a → Maybe ( f a ) With : ≃ : we can do better: split :: ( g : ≃ : f :+: r ) ⇒ g a → ( f a → b ) → ( r a → b ) → b Patrick Bahr — Composing and Decomposing Data Types — 20th June, 2014 Slide 8

  16. u n i v e r s i t y o f c o p e n h a g e n d e p a r t m e n t o f c o m p u t e r s c i e n c e Example: Desugaring data Dbl a = Double a Patrick Bahr — Composing and Decomposing Data Types — 20th June, 2014 Slide 9

  17. u n i v e r s i t y o f c o p e n h a g e n d e p a r t m e n t o f c o m p u t e r s c i e n c e Example: Desugaring data Dbl a = Double a class Desug f g where desugAlg :: f ( Fix g ) → Fix g Patrick Bahr — Composing and Decomposing Data Types — 20th June, 2014 Slide 9

  18. u n i v e r s i t y o f c o p e n h a g e n d e p a r t m e n t o f c o m p u t e r s c i e n c e Example: Desugaring data Dbl a = Double a class Desug f g where desugAlg :: f ( Fix g ) → Fix g instance ( Desug f 1 g , Desug f 2 g ) ⇒ Desug ( f 1 :+: f 2 ) g where desugAlg ( Inl x ) = desugAlg x desugAlg ( Inr x ) = desugAlg x instance ( Arith : ≺ : g ) ⇒ Desug Dbl g where desugAlg ( Double x ) = add x x instance ( f : ≺ : g ) ⇒ Desug f g where desugAlg = In . inj Patrick Bahr — Composing and Decomposing Data Types — 20th June, 2014 Slide 9

  19. u n i v e r s i t y o f c o p e n h a g e n d e p a r t m e n t o f c o m p u t e r s c i e n c e Example: Desugaring data Dbl a = Double a class Desug f g where desugAlg :: f ( Fix g ) → Fix g instance ( Desug f 1 g , Desug f 2 g ) ⇒ Desug ( f 1 :+: f 2 ) g where desugAlg ( Inl x ) = desugAlg x desugAlg ( Inr x ) = desugAlg x instance ( Arith : ≺ : g ) ⇒ Desug Dbl g where desugAlg ( Double x ) = add x x instance ( f : ≺ : g ) ⇒ Desug f g where desugAlg = In . inj desugar :: ( Desug f g , Functor f ) ⇒ Fix f → Fix g desugar = fold desugAlg Patrick Bahr — Composing and Decomposing Data Types — 20th June, 2014 Slide 9

  20. u n i v e r s i t y o f c o p e n h a g e n d e p a r t m e n t o f c o m p u t e r s c i e n c e Example: Desugaring data Dbl a = Double a class Desug f g where desugAlg :: f ( Fix g ) → Fix g instance ( Desug f 1 g , Desug f 2 g ) ⇒ Desug ( f 1 :+: f 2 ) g where desugAlg ( Inl x ) = desugAlg x desugAlg ( Inr x ) = desugAlg x instance ( Arith : ≺ : g ) ⇒ Desug Dbl g where desugAlg ( Double x ) = add x x instance ( f : ≺ : g ) ⇒ Desug f g where desugAlg = In . inj desugar :: Fix ( Dbl :+: Arith :+: Mul ) → Fix ( Arith :+: Mul ) desugar = fold desugAlg Patrick Bahr — Composing and Decomposing Data Types — 20th June, 2014 Slide 9

  21. u n i v e r s i t y o f c o p e n h a g e n d e p a r t m e n t o f c o m p u t e r s c i e n c e Example: Desugaring (cont.) desugar :: ( f : ≃ : g :+: Dbl , Arith : ≺ : g , Functor f ) ⇒ Fix f → Fix g desugar = fold desugAlg Patrick Bahr — Composing and Decomposing Data Types — 20th June, 2014 Slide 10

  22. u n i v e r s i t y o f c o p e n h a g e n d e p a r t m e n t o f c o m p u t e r s c i e n c e Example: Desugaring (cont.) desugar :: ( f : ≃ : g :+: Dbl , Arith : ≺ : g , Functor f ) ⇒ Fix f → Fix g desugar = fold desugAlg desugAlg :: ( f : ≃ : g :+: Dbl , Arith : ≺ : g ) ⇒ f ( Fix g ) → Fix g desugAlg e = split e ( λ x → In x ) ( λ ( Double x ) → add x x ) Patrick Bahr — Composing and Decomposing Data Types — 20th June, 2014 Slide 10

  23. u n i v e r s i t y o f c o p e n h a g e n d e p a r t m e n t o f c o m p u t e r s c i e n c e Example: Desugaring (cont.) desugar :: ( f : ≃ : g :+: Dbl , Arith : ≺ : g , Functor f ) ⇒ Fix f → Fix g desugar = fold desugAlg desugAlg :: ( f : ≃ : g :+: Dbl , Arith : ≺ : g ) ⇒ f ( Fix g ) → Fix g desugAlg e = split e ( λ x → In x ) ( λ ( Double x ) → add x x ) desugAlg ′ :: ( f : ≃ : g :+: Dbl , Arith : ≺ : g , Mul : ≺ : g ) ⇒ f ( Fix g ) → Fix g desugAlg ′ e = split e ( λ x → In x ) ( λ ( Double x ) → mul ( val 2 ) x ) Patrick Bahr — Composing and Decomposing Data Types — 20th June, 2014 Slide 10

  24. u n i v e r s i t y o f c o p e n h a g e n d e p a r t m e n t o f c o m p u t e r s c i e n c e ≺ : Implementation of : Patrick Bahr — Composing and Decomposing Data Types — 20th June, 2014 Slide 11

  25. u n i v e r s i t y o f c o p e n h a g e n d e p a r t m e n t o f c o m p u t e r s c i e n c e Idea Type-level function Embed : • take two signatures f , g as arguments • check whether f : ≺ : g Patrick Bahr — Composing and Decomposing Data Types — 20th June, 2014 Slide 12

  26. u n i v e r s i t y o f c o p e n h a g e n d e p a r t m e n t o f c o m p u t e r s c i e n c e Idea Type-level function Embed : • take two signatures f , g as arguments • check whether f : ≺ : g Derive implementation of inj and prj : ??? Patrick Bahr — Composing and Decomposing Data Types — 20th June, 2014 Slide 12

  27. u n i v e r s i t y o f c o p e n h a g e n d e p a r t m e n t o f c o m p u t e r s c i e n c e Idea Type-level function Embed : • take two signatures f , g as arguments • check whether f : ≺ : g • if check is successful: produce proof object for f : ≺ : g Derive implementation of inj and prj : Patrick Bahr — Composing and Decomposing Data Types — 20th June, 2014 Slide 12

  28. u n i v e r s i t y o f c o p e n h a g e n d e p a r t m e n t o f c o m p u t e r s c i e n c e Idea Type-level function Embed : • take two signatures f , g as arguments • check whether f : ≺ : g • if check is successful: produce proof object for f : ≺ : g Derive implementation of inj and prj : • also use a type class • But: use proof object as oracle in instance declarations Patrick Bahr — Composing and Decomposing Data Types — 20th June, 2014 Slide 12

  29. u n i v e r s i t y o f c o p e n h a g e n d e p a r t m e n t o f c o m p u t e r s c i e n c e Idea Type-level function Embed : • take two signatures f , g as arguments • check whether f : ≺ : g • if check is successful: produce proof object for f : ≺ : g Derive implementation of inj and prj : • also use a type class • But: use proof object as oracle in instance declarations No singleton types. This all happens at compile time! Patrick Bahr — Composing and Decomposing Data Types — 20th June, 2014 Slide 12

  30. u n i v e r s i t y o f c o p e n h a g e n d e p a r t m e n t o f c o m p u t e r s c i e n c e Proof Objects Definition data Pos = Here | Left Pos | Right Pos | Sum Pos Pos Patrick Bahr — Composing and Decomposing Data Types — 20th June, 2014 Slide 13

  31. u n i v e r s i t y o f c o p e n h a g e n d e p a r t m e n t o f c o m p u t e r s c i e n c e Proof Objects Definition data Pos = Here | Left Pos | Right Pos | Sum Pos Pos Here : f : ≺ : f Patrick Bahr — Composing and Decomposing Data Types — 20th June, 2014 Slide 13

  32. u n i v e r s i t y o f c o p e n h a g e n d e p a r t m e n t o f c o m p u t e r s c i e n c e Proof Objects Definition data Pos = Here | Left Pos | Right Pos | Sum Pos Pos Here : f : ≺ : f p : f : ≺ : g 1 p : f : ≺ : g 2 Left p : f : ≺ : g 1 :+: g 2 Right p : f : ≺ : g 1 :+: g 2 Patrick Bahr — Composing and Decomposing Data Types — 20th June, 2014 Slide 13

  33. u n i v e r s i t y o f c o p e n h a g e n d e p a r t m e n t o f c o m p u t e r s c i e n c e Proof Objects Definition data Pos = Here | Left Pos | Right Pos | Sum Pos Pos Here : f : ≺ : f p : f : ≺ : g 1 p : f : ≺ : g 2 Left p : f : ≺ : g 1 :+: g 2 Right p : f : ≺ : g 1 :+: g 2 p 1 : f 1 : ≺ : g p 2 : f 2 : ≺ : g Sum p 1 p 2 : f 1 :+: f 2 : ≺ : g Patrick Bahr — Composing and Decomposing Data Types — 20th June, 2014 Slide 13

  34. u n i v e r s i t y o f c o p e n h a g e n d e p a r t m e n t o f c o m p u t e r s c i e n c e Proof Objects Definition kind data Pos = Here | Left Pos | Right Pos | Sum Pos Pos Here : f : ≺ : f p : f : ≺ : g 1 p : f : ≺ : g 2 Left p : f : ≺ : g 1 :+: g 2 Right p : f : ≺ : g 1 :+: g 2 p 1 : f 1 : ≺ : g p 2 : f 2 : ≺ : g Sum p 1 p 2 : f 1 :+: f 2 : ≺ : g Patrick Bahr — Composing and Decomposing Data Types — 20th June, 2014 Slide 13

  35. u n i v e r s i t y o f c o p e n h a g e n d e p a r t m e n t o f c o m p u t e r s c i e n c e Proof Objects Definition type kind data Pos = Here | Left Pos | Right Pos | Sum Pos Pos Here : f : ≺ : f p : f : ≺ : g 1 p : f : ≺ : g 2 Left p : f : ≺ : g 1 :+: g 2 Right p : f : ≺ : g 1 :+: g 2 p 1 : f 1 : ≺ : g p 2 : f 2 : ≺ : g Sum p 1 p 2 : f 1 :+: f 2 : ≺ : g Patrick Bahr — Composing and Decomposing Data Types — 20th June, 2014 Slide 13

  36. u n i v e r s i t y o f c o p e n h a g e n d e p a r t m e n t o f c o m p u t e r s c i e n c e Proof Objects Definition type kind data Pos = Here | Left Pos | Right Pos | Sum Pos Pos type constructor Here : f : ≺ : f p : f : ≺ : g 1 p : f : ≺ : g 2 Left p : f : ≺ : g 1 :+: g 2 Right p : f : ≺ : g 1 :+: g 2 p 1 : f 1 : ≺ : g p 2 : f 2 : ≺ : g Sum p 1 p 2 : f 1 :+: f 2 : ≺ : g Patrick Bahr — Composing and Decomposing Data Types — 20th June, 2014 Slide 13

  37. u n i v e r s i t y o f c o p e n h a g e n d e p a r t m e n t o f c o m p u t e r s c i e n c e Construct Proof Objects data Emb = Found Pos | NotFound | Ambiguous Patrick Bahr — Composing and Decomposing Data Types — 20th June, 2014 Slide 14

  38. u n i v e r s i t y o f c o p e n h a g e n d e p a r t m e n t o f c o m p u t e r s c i e n c e Construct Proof Objects data Emb = Found Pos | NotFound | Ambiguous type family Embed ( f :: ∗ → ∗ ) ( g :: ∗ → ∗ ) :: Emb where Patrick Bahr — Composing and Decomposing Data Types — 20th June, 2014 Slide 14

  39. u n i v e r s i t y o f c o p e n h a g e n d e p a r t m e n t o f c o m p u t e r s c i e n c e Construct Proof Objects data Emb = Found Pos | NotFound | Ambiguous type family Embed ( f :: ∗ → ∗ ) ( g :: ∗ → ∗ ) :: Emb where = Found Here Embed f f Embed ( f 1 :+: f 2 ) g = Sum ′ ( Embed f 1 g ) ( Embed f 2 g ) Embed f ( g 1 :+: g 2 ) = Choose ( Embed f g 1 ) ( Embed f g 2 ) Embed f g = NotFound Patrick Bahr — Composing and Decomposing Data Types — 20th June, 2014 Slide 14

  40. u n i v e r s i t y o f c o p e n h a g e n d e p a r t m e n t o f c o m p u t e r s c i e n c e Construct Proof Objects data Emb = Found Pos | NotFound | Ambiguous type family Embed ( f :: ∗ → ∗ ) ( g :: ∗ → ∗ ) :: Emb where = Found Here Embed f f Embed ( f 1 :+: f 2 ) g = Sum ′ ( Embed f 1 g ) ( Embed f 2 g ) Embed f ( g 1 :+: g 2 ) = Choose ( Embed f g 1 ) ( Embed f g 2 ) Embed f g = NotFound type family Choose ( e 1 :: Emb ) ( e 2 :: Emb ) :: Emb where Choose ( Found p 1 ) ( Found p 1 ) = Ambiguous = Ambiguous Choose Ambiguous e 2 Choose e 1 Ambiguous = Ambiguous Choose ( Found p 1 ) e 2 = Found ( Left p 1 ) Choose e 1 ( Found p 2 ) = Found ( Right p 2 ) = NotFound Choose NotFound NotFound Patrick Bahr — Composing and Decomposing Data Types — 20th June, 2014 Slide 14

  41. u n i v e r s i t y o f c o p e n h a g e n d e p a r t m e n t o f c o m p u t e r s c i e n c e Post-Processing This is almost what we want. Patrick Bahr — Composing and Decomposing Data Types — 20th June, 2014 Slide 15

  42. u n i v e r s i t y o f c o p e n h a g e n d e p a r t m e n t o f c o m p u t e r s c i e n c e Post-Processing This is almost what we want. • We avoid ambiguity on the right-hand side: A : �≺ : A :+: A :+: C Patrick Bahr — Composing and Decomposing Data Types — 20th June, 2014 Slide 15

  43. u n i v e r s i t y o f c o p e n h a g e n d e p a r t m e n t o f c o m p u t e r s c i e n c e Post-Processing This is almost what we want. • We avoid ambiguity on the right-hand side: A : �≺ : A :+: A :+: C • We still have ambiguity on the left-hand side: A :+: A : ≺ : A :+: B Patrick Bahr — Composing and Decomposing Data Types — 20th June, 2014 Slide 15

  44. u n i v e r s i t y o f c o p e n h a g e n d e p a r t m e n t o f c o m p u t e r s c i e n c e Post-Processing This is almost what we want. • We avoid ambiguity on the right-hand side: A : �≺ : A :+: A :+: C • We still have ambiguity on the left-hand side: A :+: A : ≺ : A :+: B Solution: check for duplicates in Pos type family Dupl ( p :: Pos ) :: Bool where . . . Patrick Bahr — Composing and Decomposing Data Types — 20th June, 2014 Slide 15

  45. u n i v e r s i t y o f c o p e n h a g e n d e p a r t m e n t o f c o m p u t e r s c i e n c e Post-Processing This is almost what we want. • We avoid ambiguity on the right-hand side: A : �≺ : A :+: A :+: C Sum ( Left Here ) ( Left Here ) • We still have ambiguity on the left-hand side: A :+: A : ≺ : A :+: B Solution: check for duplicates in Pos type family Dupl ( p :: Pos ) :: Bool where . . . Patrick Bahr — Composing and Decomposing Data Types — 20th June, 2014 Slide 15

  46. u n i v e r s i t y o f c o p e n h a g e n d e p a r t m e n t o f c o m p u t e r s c i e n c e Are we there yet? • Check whether f : ≺ : g • Construct proof for f : ≺ : g • Derive inj and prj Patrick Bahr — Composing and Decomposing Data Types — 20th June, 2014 Slide 16

  47. u n i v e r s i t y o f c o p e n h a g e n d e p a r t m e n t o f c o m p u t e r s c i e n c e Are we there yet? • Check whether f : ≺ : g � • Construct proof for f : ≺ : g • Derive inj and prj Patrick Bahr — Composing and Decomposing Data Types — 20th June, 2014 Slide 16

  48. u n i v e r s i t y o f c o p e n h a g e n d e p a r t m e n t o f c o m p u t e r s c i e n c e Are we there yet? • Check whether f : ≺ : g � • Construct proof for f : ≺ : g � • Derive inj and prj Patrick Bahr — Composing and Decomposing Data Types — 20th June, 2014 Slide 16

  49. u n i v e r s i t y o f c o p e n h a g e n d e p a r t m e n t o f c o m p u t e r s c i e n c e Are we there yet? • Check whether f : ≺ : g � • Construct proof for f : ≺ : g � • Derive inj and prj Patrick Bahr — Composing and Decomposing Data Types — 20th June, 2014 Slide 16

  50. u n i v e r s i t y o f c o p e n h a g e n d e p a r t m e n t o f c o m p u t e r s c i e n c e Derive inj and prj f : ≺ : g where class inj :: f a → g a prj :: g a → Maybe ( f a ) instance f : ≺ : f where . . . f : ≺ : ( f :+: g 2 ) where . . . instance instance f : ≺ : g 2 ⇒ f : ≺ : ( g 1 :+: g 2 ) where . . . Patrick Bahr — Composing and Decomposing Data Types — 20th June, 2014 Slide 17

  51. u n i v e r s i t y o f c o p e n h a g e n d e p a r t m e n t o f c o m p u t e r s c i e n c e Derive inj and prj class Sub f g where inj :: f a → g a prj :: g a → Maybe ( f a ) instance Sub f f where . . . ( f :+: g 2 ) where . . . instance Sub f instance Sub f g 2 ⇒ Sub f ( g 1 :+: g 2 ) where . . . Patrick Bahr — Composing and Decomposing Data Types — 20th June, 2014 Slide 17

  52. u n i v e r s i t y o f c o p e n h a g e n d e p a r t m e n t o f c o m p u t e r s c i e n c e Derive inj and prj class Sub f g where inj :: f a → g a prj :: g a → Maybe ( f a ) instance Sub f f where . . . instance Sub f g 1 ⇒ Sub f ( g 1 :+: g 2 ) where . . . instance Sub f g 2 ⇒ Sub f ( g 1 :+: g 2 ) where . . . Patrick Bahr — Composing and Decomposing Data Types — 20th June, 2014 Slide 17

  53. u n i v e r s i t y o f c o p e n h a g e n d e p a r t m e n t o f c o m p u t e r s c i e n c e Derive inj and prj class Sub f g where inj :: f a → g a prj :: g a → Maybe ( f a ) instance Sub f f where . . . instance Sub f g 1 ⇒ Sub f ( g 1 :+: g 2 ) where . . . instance Sub f g 2 ⇒ Sub f ( g 1 :+: g 2 ) where . . . instance ( Sub f 1 g , Sub f 2 g ) ⇒ ( f 1 :+: f 2 ) g Sub where . . . Patrick Bahr — Composing and Decomposing Data Types — 20th June, 2014 Slide 17

  54. u n i v e r s i t y o f c o p e n h a g e n d e p a r t m e n t o f c o m p u t e r s c i e n c e Derive inj and prj class Sub ( e :: Emb ) f g where inj :: f a → g a prj :: g a → Maybe ( f a ) instance Sub f f where . . . instance Sub f g 1 ⇒ Sub f ( g 1 :+: g 2 ) where . . . instance Sub f g 2 ⇒ Sub f ( g 1 :+: g 2 ) where . . . instance ( Sub f 1 g , Sub f 2 g ) ⇒ ( f 1 :+: f 2 ) g Sub where . . . Patrick Bahr — Composing and Decomposing Data Types — 20th June, 2014 Slide 17

  55. u n i v e r s i t y o f c o p e n h a g e n d e p a r t m e n t o f c o m p u t e r s c i e n c e Derive inj and prj Here : f : ≺ : f class Sub ( e :: Emb ) f g where inj :: f a → g a prj :: g a → Maybe ( f a ) instance Sub ( Found Here ) f f where . . . instance Sub f g 1 ⇒ Sub f ( g 1 :+: g 2 ) where . . . instance Sub f g 2 ⇒ Sub f ( g 1 :+: g 2 ) where . . . instance ( Sub f 1 g , Sub f 2 g ) ⇒ ( f 1 :+: f 2 ) g Sub where . . . Patrick Bahr — Composing and Decomposing Data Types — 20th June, 2014 Slide 17

  56. u n i v e r s i t y o f c o p e n h a g e n d e p a r t m e n t o f c o m p u t e r s c i e n c e p : f : ≺ : g 1 Derive inj and prj Left p : f : ≺ : g 1 :+: g 2 class Sub ( e :: Emb ) f g where inj :: f a → g a prj :: g a → Maybe ( f a ) instance Sub ( Found Here ) f f where . . . instance Sub ( Found p ) f g 1 ⇒ Sub ( Found ( Left p )) f ( g 1 :+: g 2 ) where . . . instance Sub f g 2 ⇒ Sub f ( g 1 :+: g 2 ) where . . . instance ( Sub f 1 g , Sub f 2 g ) ⇒ ( f 1 :+: f 2 ) g Sub where . . . Patrick Bahr — Composing and Decomposing Data Types — 20th June, 2014 Slide 17

  57. u n i v e r s i t y o f c o p e n h a g e n d e p a r t m e n t o f c o m p u t e r s c i e n c e p : f : ≺ : g 2 Derive inj and prj Right p : f : ≺ : g 1 :+: g 2 class Sub ( e :: Emb ) f g where inj :: f a → g a prj :: g a → Maybe ( f a ) instance Sub ( Found Here ) f f where . . . instance Sub ( Found p ) f g 1 ⇒ Sub ( Found ( Left p )) f ( g 1 :+: g 2 ) where . . . instance Sub ( Found p ) f g 2 ⇒ Sub ( Found ( Right p )) f ( g 1 :+: g 2 ) where . . . instance ( Sub f 1 g , Sub f 2 g ) ⇒ ( f 1 :+: f 2 ) g Sub where . . . Patrick Bahr — Composing and Decomposing Data Types — 20th June, 2014 Slide 17

  58. u n i v e r s i t y o f c o p e n h a g e n d e p a r t m e n t o f c o m p u t e r s c i e n c e p 1 : f 1 : ≺ : g p 2 : f 2 : ≺ : g Derive inj and prj Sum p 1 p 2 : f 1 :+: f 2 : ≺ : g class Sub ( e :: Emb ) f g where inj :: f a → g a prj :: g a → Maybe ( f a ) instance Sub ( Found Here ) f f where . . . instance Sub ( Found p ) f g 1 ⇒ Sub ( Found ( Left p )) f ( g 1 :+: g 2 ) where . . . instance Sub ( Found p ) f g 2 ⇒ Sub ( Found ( Right p )) f ( g 1 :+: g 2 ) where . . . instance ( Sub ( Found p 1 ) f 1 g , Sub ( Found p 2 ) f 2 g ) ⇒ Sub ( Found ( Sum p 1 p 2 )) ( f 1 :+: f 2 ) g where . . . Patrick Bahr — Composing and Decomposing Data Types — 20th June, 2014 Slide 17

  59. u n i v e r s i t y o f c o p e n h a g e n d e p a r t m e n t o f c o m p u t e r s c i e n c e Derive inj and prj class Sub ( e :: Emb ) f g where inj :: Proxy e → f a → g a prj :: Proxy e → g a → Maybe ( f a ) instance Sub ( Found Here ) f f where . . . instance Sub ( Found p ) f g 1 ⇒ Sub ( Found ( Left p )) f ( g 1 :+: g 2 ) where . . . instance Sub ( Found p ) f g 2 ⇒ Sub ( Found ( Right p )) f ( g 1 :+: g 2 ) where . . . instance ( Sub ( Found p 1 ) f 1 g , Sub ( Found p 2 ) f 2 g ) ⇒ Sub ( Found ( Sum p 1 p 2 )) ( f 1 :+: f 2 ) g where . . . Patrick Bahr — Composing and Decomposing Data Types — 20th June, 2014 Slide 17

  60. u n i v e r s i t y o f c o p e n h a g e n d e p a r t m e n t o f c o m p u t e r s c i e n c e Are we there yet? • Check whether f : ≺ : g � • Construct proof for f : ≺ : g � • Derive inj and prj Patrick Bahr — Composing and Decomposing Data Types — 20th June, 2014 Slide 18

  61. u n i v e r s i t y o f c o p e n h a g e n d e p a r t m e n t o f c o m p u t e r s c i e n c e Are we there yet? • Check whether f : ≺ : g � • Construct proof for f : ≺ : g � • Derive inj and prj � Patrick Bahr — Composing and Decomposing Data Types — 20th June, 2014 Slide 18

  62. u n i v e r s i t y o f c o p e n h a g e n d e p a r t m e n t o f c o m p u t e r s c i e n c e Are we there yet? • Check whether f : ≺ : g � • Construct proof for f : ≺ : g � • Derive inj and prj � (sort of) Patrick Bahr — Composing and Decomposing Data Types — 20th June, 2014 Slide 18

  63. u n i v e r s i t y o f c o p e n h a g e n d e p a r t m e n t o f c o m p u t e r s c i e n c e Final Implementation of : ≺ : class Sub ( e :: Emb ) f g where inj :: Proxy e → f a → g a prj :: Proxy e → g a → Maybe ( f a ) Patrick Bahr — Composing and Decomposing Data Types — 20th June, 2014 Slide 19

  64. u n i v e r s i t y o f c o p e n h a g e n d e p a r t m e n t o f c o m p u t e r s c i e n c e Final Implementation of : ≺ : class Sub ( e :: Emb ) f g where inj :: Proxy e → f a → g a prj :: Proxy e → g a → Maybe ( f a ) type f : ≺ : g = Sub ( Post ( Embed f g )) f g Patrick Bahr — Composing and Decomposing Data Types — 20th June, 2014 Slide 19

  65. u n i v e r s i t y o f c o p e n h a g e n d e p a r t m e n t o f c o m p u t e r s c i e n c e Final Implementation of : ≺ : class Sub ( e :: Emb ) f g where inj ′ :: Proxy e → f a → g a prj ′ :: Proxy e → g a → Maybe ( f a ) type f : ≺ : g = Sub ( Post ( Embed f g )) f g Patrick Bahr — Composing and Decomposing Data Types — 20th June, 2014 Slide 19

  66. u n i v e r s i t y o f c o p e n h a g e n d e p a r t m e n t o f c o m p u t e r s c i e n c e Final Implementation of : ≺ : class Sub ( e :: Emb ) f g where inj ′ :: Proxy e → f a → g a prj ′ :: Proxy e → g a → Maybe ( f a ) type f : ≺ : g = Sub ( Post ( Embed f g )) f g inj :: ( f : ≺ : g ) ⇒ f a → g a inj = inj ′ ( P :: Proxy ( Post ( Embed f g ))) prj :: ( f : ≺ : g ) ⇒ g a → Maybe ( f a ) prj = prj ′ ( P :: Proxy ( Post ( Embed f g ))) Patrick Bahr — Composing and Decomposing Data Types — 20th June, 2014 Slide 19

  67. Type-Level Programming in Haskell

  68. Type-Level Programming in Haskell • Now : ≺ : has the properties we want / expect • Avoid “ambiguous” subtyping • New isomorphism constraint : ≃ :

  69. Type-Level Programming in Haskell • Now : ≺ : has the properties we want / expect • Avoid “ambiguous” subtyping • New isomorphism constraint : ≃ : • You can try it: > cabal install compdata

  70. Type-Level Programming in Haskell

  71. u n i v e r s i t y o f c o p e n h a g e n d e p a r t m e n t o f c o m p u t e r s c i e n c e Compile Time Performance • If done “wrong”, this implementation can be very slow! Patrick Bahr — Composing and Decomposing Data Types — 20th June, 2014 Slide 22

  72. u n i v e r s i t y o f c o p e n h a g e n d e p a r t m e n t o f c o m p u t e r s c i e n c e Compile Time Performance • If done “wrong”, this implementation can be very slow! • Implementation presented here: O ( n 2 ) Patrick Bahr — Composing and Decomposing Data Types — 20th June, 2014 Slide 22

  73. u n i v e r s i t y o f c o p e n h a g e n d e p a r t m e n t o f c o m p u t e r s c i e n c e Compile Time Performance • If done “wrong”, this implementation can be very slow! • Implementation presented here: O ( n 2 ) • Slightly different implementation: O (2 n ) (but essentially the same) Patrick Bahr — Composing and Decomposing Data Types — 20th June, 2014 Slide 22

  74. u n i v e r s i t y o f c o p e n h a g e n d e p a r t m e n t o f c o m p u t e r s c i e n c e Compile Time Performance • If done “wrong”, this implementation can be very slow! • Implementation presented here: O ( n 2 ) • Slightly different implementation: O (2 n ) (but essentially the same) • micro benchmark: • derive F : ≺ : G • 9 summands in F and G Patrick Bahr — Composing and Decomposing Data Types — 20th June, 2014 Slide 22

  75. u n i v e r s i t y o f c o p e n h a g e n d e p a r t m e n t o f c o m p u t e r s c i e n c e Compile Time Performance • If done “wrong”, this implementation can be very slow! • Implementation presented here: O ( n 2 ) • Slightly different implementation: O (2 n ) (but essentially the same) • micro benchmark: • derive F : ≺ : G • 9 summands in F and G • Implementation presented here: 0.5s Patrick Bahr — Composing and Decomposing Data Types — 20th June, 2014 Slide 22

  76. u n i v e r s i t y o f c o p e n h a g e n d e p a r t m e n t o f c o m p u t e r s c i e n c e Compile Time Performance • If done “wrong”, this implementation can be very slow! • Implementation presented here: O ( n 2 ) • Slightly different implementation: O (2 n ) (but essentially the same) • micro benchmark: • derive F : ≺ : G • 9 summands in F and G • Implementation presented here: 0.5s • Naive implementation: 45s Patrick Bahr — Composing and Decomposing Data Types — 20th June, 2014 Slide 22

  77. u n i v e r s i t y o f c o p e n h a g e n d e p a r t m e n t o f c o m p u t e r s c i e n c e Compile Time Performance • If done “wrong”, this implementation can be very slow! • Implementation presented here: O ( n 2 ) • Slightly different implementation: O (2 n ) (but essentially the same) • micro benchmark: • derive F : ≺ : G • 9 summands in F and G • Implementation presented here: 0.5s • Naive implementation: 45s • Type families on kind ∗ are expensive! Patrick Bahr — Composing and Decomposing Data Types — 20th June, 2014 Slide 22

  78. Type-Level Programming in Haskell

Download Presentation
Download Policy: The content available on the website is offered to you 'AS IS' for your personal information and use only. It cannot be commercialized, licensed, or distributed on other websites without prior consent from the author. To download a presentation, simply click this link. If you encounter any difficulties during the download process, it's possible that the publisher has removed the file from their server.

Recommend


More recommend