type families with class type classes with family
play

Type Families with Class, Type Classes with Family Alejandro Serrano - PowerPoint PPT Presentation

Type Families with Class, Type Classes with Family Alejandro Serrano 1 Jurriaan Hage 1 Patrick Bahr 2 1 Utrecht University 2 IT University of Copenhagen Haskell Symposium 2015 Motivation Type-level programming in Haskell/GHC functional


  1. Type Families with Class, Type Classes with Family Alejandro Serrano 1 Jurriaan Hage 1 Patrick Bahr 2 1 Utrecht University 2 IT University of Copenhagen Haskell Symposium 2015

  2. Motivation Type-level programming in Haskell/GHC ◮ functional dependencies ◮ type families ◮ data type promotion, kind polymorphism ◮ closed type families 2 / 18

  3. Motivation Type-level programming in Haskell/GHC ◮ functional dependencies ◮ type families ◮ data type promotion, kind polymorphism ◮ closed type families Goal ◮ use type families to simulate type classes ◮ gain flexibility and expressiveness 2 / 18

  4. Overview ◮ Simulate type classes using type families (without class methods) ◮ What can we do with this encoding? ◮ Proposal: type families with elaboration 3 / 18

  5. Encoding type classes Simplification (for now): type class = predicate on types 4 / 18

  6. Encoding type classes Simplification (for now): type class = predicate on types IsC :: κ 1 → ... → κ n → Bool class C t 1 ... t n � 4 / 18

  7. Encoding type classes Simplification (for now): type class = predicate on types IsC :: κ 1 → ... → κ n → Bool class C t 1 ... t n � Instead of Bool we use: data Defined = Yes | No 4 / 18

  8. Encoding type classes Simplification (for now): type class = predicate on types IsC :: κ 1 → ... → κ n → Defined class C t 1 ... t n � Instead of Bool we use: data Defined = Yes | No 4 / 18

  9. Encoding type classes Simplification (for now): type class = predicate on types IsC :: κ 1 → ... → κ n → Defined class C t 1 ... t n � Instead of Bool we use: data Defined = Yes | No Type family declaration type family IsC t 1 ... t n :: Defined 4 / 18

  10. Example: Eq Type class declaration class Eq a where ( ≡ ) :: a → a → Bool 5 / 18

  11. Example: Eq Type class declaration class Eq a where 5 / 18

  12. Example: Eq Type class declaration class Eq a where Translation into type family declaration type family IsEq ( a :: ∗ ) :: Defined 5 / 18

  13. Example: Eq Type class declaration class Eq a where Translation into type family declaration type family IsEq ( a :: ∗ ) :: Defined Usage f :: Eq a ⇒ a → a 5 / 18

  14. Example: Eq Type class declaration class Eq a where Translation into type family declaration type family IsEq ( a :: ∗ ) :: Defined Usage f :: IsEq a ∼ Yes ⇒ a → a 5 / 18

  15. Example: Eq Type class declaration class Eq a where Translation into type family declaration type family IsEq ( a :: ∗ ) :: Defined Usage type Eq a = IsEq a ∼ Yes f :: IsEq a ∼ Yes ⇒ a → a 5 / 18

  16. Example: Eq Type class declaration class Eq a where Translation into type family declaration type family IsEq ( a :: ∗ ) :: Defined Usage type Eq a = IsEq a ∼ Yes f :: Eq a ⇒ a → a 5 / 18

  17. Example: Eq Type class instance declarations instance Eq Int where ... instance Eq a ⇒ Eq [ a ] where ... instance ( Eq a , Eq b ) ⇒ Eq ( a , b ) where ... 6 / 18

  18. Example: Eq Type class instance declarations instance Eq Int where ... instance Eq a ⇒ Eq [ a ] where ... instance ( Eq a , Eq b ) ⇒ Eq ( a , b ) where ... Type family instance declarations type instance IsEq Int = Yes type instance IsEq [ a ] = IsEq a type instance IsEq ( a , b ) = And ( IsEq a ) ( IsEq b ) 6 / 18

  19. Example: Eq Type class instance declarations instance Eq Int where ... instance Eq a ⇒ Eq [ a ] where ... instance ( Eq a , Eq b ) ⇒ Eq ( a , b ) where ... type family And ( x :: Defined ) ( y :: Defined ) :: Defined where Type family instance declarations And Yes Yes = Yes = No And x y type instance IsEq Int = Yes type instance IsEq [ a ] = IsEq a type instance IsEq ( a , b ) = And ( IsEq a ) ( IsEq b ) 6 / 18

  20. What Can We Express ◮ super classes ◮ limited forms functional dependencies (requires injective type families) ◮ not supported: overlapping instances 7 / 18

  21. What else can we do with this encoding? 8 / 18

  22. What else can we do with this encoding? ◮ type class directives ◮ custom error messages ◮ instance chains 8 / 18

  23. Non-membership type instance IsShow ( a → b ) = No 9 / 18

  24. Non-membership type instance IsShow ( a → b ) = No Couldn’t match type ’No with ’Yes Expected type: ’Yes Actual type: IsShow (t -> t) 9 / 18

  25. Closed set of instances type family IsIntegral t where IsIntegral Int = Yes IsIntegral Integer = Yes = No IsIntegral t 10 / 18

  26. Disjointness data IntegralOrFractional = Integral | Fractional | None type family IsIntegralOrFractional t :: IntegralOrFractional 11 / 18

  27. Disjointness data IntegralOrFractional = Integral | Fractional | None type family IsIntegralOrFractional t :: IntegralOrFractional type instance IsIntegralOrFractional Int = Integral type instance IsIntegralOrFractional Integer = Integral type instance IsIntegralOrFractional Double = Fractional 11 / 18

  28. Disjointness data IntegralOrFractional = Integral | Fractional | None type family IsIntegralOrFractional t :: IntegralOrFractional type instance IsIntegralOrFractional Int = Integral type instance IsIntegralOrFractional Integer = Integral type instance IsIntegralOrFractional Double = Fractional type IsIntegral t = IsIntegral ′ ( IsIntegralOrFractional t ) type family IsIntegral ′ c :: Defined where IsIntegral ′ Integral = Yes IsIntegral ′ c = No 11 / 18

  29. Custom Error Messages data Defined = Yes | No 12 / 18

  30. Custom Error Messages data Defined e = Yes | No e 12 / 18

  31. Custom Error Messages data Defined e = Yes | No e Example type IsIntegral t = IsIntegral ′ ( IsIntegralOrFractional t ) type family IsIntegral ′ c :: Defined Symbol where IsIntegral ′ Integral = Yes IsIntegral ′ Fractional = No "is instance of Factional" IsIntegral ′ c = No "" 12 / 18

  32. Custom Error Messages data Defined e = Yes | No e Example type IsIntegral t = IsIntegral ′ ( IsIntegralOrFractional t ) type family IsIntegral ′ c :: Defined Symbol where IsIntegral ′ Integral = Yes IsIntegral ′ Fractional = No "is instance of Factional" IsIntegral ′ c = No "" Couldn’t match type ’No "is instance of Fractional" with ’Yes Expected type: ’Yes Actual type: IsIntegral Double 12 / 18

  33. Instance Chains [Morris & Jones] ◮ explicit failure ◮ provide alternatives ( else clause) 13 / 18

  34. Instance Chains [Morris & Jones] ◮ explicit failure ◮ provide alternatives ( else clause) Example instance Show ( a → b ) if ( Enum a , Show a , Show b ) where show = ... else instance Show ( a → b ) fails 13 / 18

  35. Instance Chains [Morris & Jones] ◮ explicit failure ◮ provide alternatives ( else clause) Example instance Show ( a → b ) if ( Enum a , Show a , Show b ) where show = ... else instance Show ( a → b ) fails As type family type instance IsShow ( a → b ) = IsShowFn a b type family IsShowFn a b = And 3 ( IsEnum a ) ( IsShow a ) ( IsShow b ) 13 / 18

  36. What about class methods? 14 / 18

  37. What about class methods? Two possibilities: ◮ Use type classes ◮ Extend type families with elaboration 14 / 18

  38. What about class methods? = Yes | No e data Defined e Two possibilities: ◮ Use type classes ◮ Extend type families with elaboration 14 / 18

  39. What about class methods? data Defined e p = Yes p | No e Two possibilities: ◮ Use type classes ◮ Extend type families with elaboration 14 / 18

  40. What about class methods? Two possibilities: ◮ Use type classes ◮ Extend type families with elaboration 14 / 18

  41. What about class methods? Two possibilities: ◮ Use type classes ◮ Extend type families with elaboration 14 / 18

  42. Elaboration at Rewriting assign a dictionary to type families 15 / 18

  43. Elaboration at Rewriting assign a dictionary to type families Example type family IsEq ( t :: ∗ ) :: Defined dictionary eq :: t → t → Bool 15 / 18

  44. Elaboration at Rewriting assign a dictionary to type families Example type family IsEq ( t :: ∗ ) :: Defined dictionary eq :: t → t → Bool type instance IsEq Int = Yes dictionary eq = primEqInt -- the primitive Int comparison 15 / 18

  45. Elaboration at Rewriting assign a dictionary to type families Example type family IsEq ( t :: ∗ ) :: Defined dictionary eq :: t → t → Bool type instance IsEq Int = Yes dictionary eq = primEqInt -- the primitive Int comparison type instance IsEq [ a ] = e @( IsEq a ) dictionary eq [ ] [ ] = True eq ( x : xs ) ( y : ys ) = e @ eq x y ∧ eq xs ys eq = False 15 / 18

  46. Example: Data Types ` a la Carte type family f : < : g :: Defined dictionary inj :: f a → g a e : < : e = Yes dictionary inj = id where f : < : ( x :+: y ) = d @( Choose f x y l @( f : < : x ) r @( f : < : y )) dictionary inj = d @ choice l @ inj r @ inj f : < : g = No type family Choose f x y fx fy :: Defined dictionary choice :: ( f a → x a ) → ( f a → y a ) → f a → ( x :+: y ) a = Yes where Choose f x y Yes fy dictionary choice x y = Inl ◦ x Choose f x y fx Yes = Yes dictionary choice x y = Inr ◦ y Choose f x y fx fy = No 16 / 18

  47. Conclusions Future work ◮ study elaboration further ◮ use encoding as implementation of type classes? 17 / 18

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