generic programming with fixed points for mutually
play

Generic programming with fixed points for mutually recursive - PowerPoint PPT Presentation

[ Faculty of Science Information and Computing Sciences] Generic programming with fixed points for mutually recursive datatypes Andres L oh joint work with Alexey Rodriguez, Stefan Holdermans, Johan Jeuring Dept. of Information and


  1. [ Faculty of Science Information and Computing Sciences] Generic programming with fixed points for mutually recursive datatypes Andres L¨ oh joint work with Alexey Rodriguez, Stefan Holdermans, Johan Jeuring Dept. of Information and Computing Sciences, Utrecht University P.O. Box 80.089, 3508 TB Utrecht, The Netherlands Web pages: http://www.cs.uu.nl/wiki/Center September 2, 2009

  2. Datatype-generic programming ◮ Write functions that depend on the structure of datatypes. ◮ Equality, parsing, . . . ◮ Traversing data structures, collecting or modifying items. ◮ Type-indexed data types: tries, zippers. [ Faculty of Science Information and Computing Sciences] 2

  3. This talk ◮ Yet another (datatype-)generic programming library for Haskell. ◮ Gives you access to recursive positions, i.e., it is easy to write a generic fold/catamorphism. ◮ Allows you to define type-indexed datatypes, e.g., zippers. ◮ Applicable to a large class of datatypes, in particular mutually recursive datatypes. [ Faculty of Science Information and Computing Sciences] 3

  4. This talk ◮ Yet another (datatype-)generic programming library for Haskell. ◮ Gives you access to recursive positions, i.e., it is easy to write a generic fold/catamorphism. ◮ Allows you to define type-indexed datatypes, e.g., zippers. ◮ Applicable to a large class of datatypes, in particular mutually recursive datatypes. [ Faculty of Science Information and Computing Sciences] 3

  5. What is in a generic programming library? ◮ Represent datatypes generically. ◮ Map between user types and their representations. ◮ Define functions based on representations. [ Faculty of Science Information and Computing Sciences] 4

  6. What is in a generic programming library? ◮ Represent datatypes generically. ◮ Map between user types and their representations. ◮ Define functions based on representations. We focus on the first: generic view or universe. [ Faculty of Science Information and Computing Sciences] 4

  7. PolyP (Jansson and Jeuring 1997) The first approach to generic programming in Haskell: ◮ Datatypes are represented as fixed points of sums of products. [ Faculty of Science Information and Computing Sciences] 5

  8. Example data Expr = Const Val | If Expr Expr Expr [ Faculty of Science Information and Computing Sciences] 6

  9. Example data Expr = Const Val | If Expr Expr Expr As a functor: data ExprF e = ConstF Val | IfF e e e type Expr ′ = Fix ExprF data Fix f = In ( f ( Fix f )) [ Faculty of Science Information and Computing Sciences] 6

  10. Example data Expr = Const Val | If Expr Expr Expr As a functor: type ExprF e = Val | e e e type Expr ′ = Fix ExprF data Fix f = In ( f ( Fix f )) [ Faculty of Science Information and Computing Sciences] 6

  11. Example data Expr = Const Val | If Expr Expr Expr As a functor: type ExprF e = Val + e e e type Expr ′ = Fix ExprF data Fix f = In ( f ( Fix f )) [ Faculty of Science Information and Computing Sciences] 6

  12. Example data Expr = Const Val | If Expr Expr Expr As a functor: type ExprF e = Val + e × e × e type Expr ′ = Fix ExprF data Fix f = In ( f ( Fix f )) [ Faculty of Science Information and Computing Sciences] 6

  13. Example data Expr = Const Val | If Expr Expr Expr As a functor: type ExprF = K Val :+: I : × : I : × : I type Expr ′ = Fix ExprF data Fix f = In ( f ( Fix f )) [ Faculty of Science Information and Computing Sciences] 6

  14. Combinators data I r = I r data K a r = K a data U r = U -- for constructors with no arguments data ( f :+: g ) r = L ( f r ) | R ( g r ) data ( f : × : g ) r = f r : × : g r Functors are of kind ∗ → ∗ . data Fix ( f :: ∗ → ∗ ) = In ( f ( Fix f )) [ Faculty of Science Information and Computing Sciences] 7

  15. Writing a generic function class Functor f where fmap :: ( a → b ) → f a → f b instance Functor ( K a ) where fmap f ( K x ) = K x instance Functor I where fmap f ( I x ) = I ( f x ) -- instances for the other functor combinators [ Faculty of Science Information and Computing Sciences] 8

  16. Writing a generic function class Functor f where fmap :: ( a → b ) → f a → f b instance Functor ( K a ) where fmap f ( K x ) = K x instance Functor I where fmap f ( I x ) = I ( f x ) -- instances for the other functor combinators fold :: Functor f ⇒ ( f r → r ) → Fix f → r fold alg ( In f ) = alg ( fmap ( fold alg ) f ) [ Faculty of Science Information and Computing Sciences] 8

  17. Summary of workflow ◮ Use a limited set of combinators to build functors (library). ◮ Express datatypes as fixed points of functors (user or Template Haskell). ◮ Express the equivalence using a pair of conversion functions (user or Template Haskell). ◮ Define functions (and datatypes) on the structure of functors (library). ◮ Enjoy generic functions on all the represented datatypes (user). [ Faculty of Science Information and Computing Sciences] 9

  18. Limitation of the PolyP approach Only regular datatypes can be represented. data Expr = Const Val | If Expr Expr Expr [ Faculty of Science Information and Computing Sciences] 10

  19. Limitation of the PolyP approach Only regular datatypes can be represented. data Expr = Const Val | If Expr Expr Expr | Bin Expr Op Expr [ Faculty of Science Information and Computing Sciences] 10

  20. Limitation of the PolyP approach Only regular datatypes can be represented. data Expr = Const Val | If Expr Expr Expr | Bin Expr Op Expr data Op = Add | Mul | Infix Expr | Flip Op [ Faculty of Science Information and Computing Sciences] 10

  21. Limitation of the PolyP approach Only regular datatypes can be represented. data Expr = Const Val | If Expr Expr Expr | Bin Expr Op Expr data Op = Add | Mul | Infix Expr | Flip Op Typical ASTs are not regular, but a family of several mutually recursive datatypes. [ Faculty of Science Information and Computing Sciences] 10

  22. Classic attempts data Expr = Const Val | If Expr Expr Expr data ExprF e = ConstF Val | IfF e e e type Expr ′ = Fix ExprF [ Faculty of Science Information and Computing Sciences] 11

  23. Classic attempts data Expr = Const Val | If Expr Expr Expr | Bin Expr Op Expr data Op = Add | Mul | Infix Expr | Flip Op data ExprF e o = ConstF Val | IfF e e e | BinF e o e data OpF e o = AddF | MulF | InfixF e | FlipF o type Expr ′ = Fix 2 , 0 ExprF OpF type Op ′ = Fix 2 , 1 ExprF OpF [ Faculty of Science Information and Computing Sciences] 11

  24. Kinds Fix :: ( ∗ → ∗ ) → ∗ [ Faculty of Science Information and Computing Sciences] 12

  25. Kinds Fix :: ( ∗ → ∗ ) → ∗ Fix 2 , 0 :: ( ∗ → ∗ → ∗ ) → ( ∗ → ∗ → ∗ ) → ∗ Fix 2 , 1 :: ( ∗ → ∗ → ∗ ) → ( ∗ → ∗ → ∗ ) → ∗ [ Faculty of Science Information and Computing Sciences] 12

  26. Kinds Fix :: ( ∗ → ∗ ) → ∗ Fix 2 , 0 :: ( ∗ → ∗ → ∗ ) → ( ∗ → ∗ → ∗ ) → ∗ Fix 2 , 1 :: ( ∗ → ∗ → ∗ ) → ( ∗ → ∗ → ∗ ) → ∗ Fix 3 , 0 :: ( ∗ → ∗ → ∗ → ∗ ) → ( ∗ → ∗ → ∗ → ∗ ) → ( ∗ → ∗ → ∗ → ∗ ) → ∗ Fix 3 , 1 :: ( ∗ → ∗ → ∗ → ∗ ) → ( ∗ → ∗ → ∗ → ∗ ) → ( ∗ → ∗ → ∗ → ∗ ) → ∗ Fix 3 , 2 :: ( ∗ → ∗ → ∗ → ∗ ) → ( ∗ → ∗ → ∗ → ∗ ) → ( ∗ → ∗ → ∗ → ∗ ) → ∗ [ Faculty of Science Information and Computing Sciences] 12

  27. Kinds Fix :: ( ∗ → ∗ ) → ∗ Fix 2 , 0 :: ( ∗ → ∗ → ∗ ) → ( ∗ → ∗ → ∗ ) → ∗ Fix 2 , 1 :: ( ∗ → ∗ → ∗ ) → ( ∗ → ∗ → ∗ ) → ∗ Fix 3 , 0 :: ( ∗ → ∗ → ∗ → ∗ ) → ( ∗ → ∗ → ∗ → ∗ ) → ( ∗ → ∗ → ∗ → ∗ ) → ∗ Fix 3 , 1 :: ( ∗ → ∗ → ∗ → ∗ ) → ( ∗ → ∗ → ∗ → ∗ ) → ( ∗ → ∗ → ∗ → ∗ ) → ∗ Fix 3 , 2 :: ( ∗ → ∗ → ∗ → ∗ ) → ( ∗ → ∗ → ∗ → ∗ ) → ( ∗ → ∗ → ∗ → ∗ ) → ∗ . . . [ Faculty of Science Information and Computing Sciences] 12

  28. Kinds (contd.) Fix 2 , 0 :: ( ∗ → ∗ → ∗ ) → ( ∗ → ∗ → ∗ ) → ∗ Fix 2 , 1 :: ( ∗ → ∗ → ∗ ) → ( ∗ → ∗ → ∗ ) → ∗ [ Faculty of Science Information and Computing Sciences] 13

  29. Kinds (contd.) Fix 2 , 0 :: ( ∗ → ∗ → ∗ ) → ( ∗ → ∗ → ∗ ) → ∗ Fix 2 , 1 :: ( ∗ → ∗ → ∗ ) → ( ∗ → ∗ → ∗ ) → ∗ If we had tuples on the kind level: Fix 2 :: ( ∗ 2 → ∗ ) 2 → ∗ 2 [ Faculty of Science Information and Computing Sciences] 13

  30. Kinds (contd.) Fix 2 , 0 :: ( ∗ → ∗ → ∗ ) → ( ∗ → ∗ → ∗ ) → ∗ Fix 2 , 1 :: ( ∗ → ∗ → ∗ ) → ( ∗ → ∗ → ∗ ) → ∗ If we had tuples on the kind level: Fix 2 :: ( ∗ 2 → ∗ ) 2 → ∗ 2 And if we had numbers as kinds: Fix 2 :: ((2 → ∗ ) → (2 → ∗ )) → (2 → ∗ ) [ Faculty of Science Information and Computing Sciences] 13

  31. Kinds (contd.) Fix 2 , 0 :: ( ∗ → ∗ → ∗ ) → ( ∗ → ∗ → ∗ ) → ∗ Fix 2 , 1 :: ( ∗ → ∗ → ∗ ) → ( ∗ → ∗ → ∗ ) → ∗ If we had tuples on the kind level: Fix 2 :: ( ∗ 2 → ∗ ) 2 → ∗ 2 And if we had numbers as kinds: Fix 2 :: ((2 → ∗ ) → (2 → ∗ )) → (2 → ∗ ) And this can be generalized: Fix n :: (( n → ∗ ) → ( n → ∗ )) → ( n → ∗ ) [ Faculty of Science Information and Computing Sciences] 13

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