SLIDE 1 Inferring Datatypes
Ningning Xie HIW 2019.08.23
SLIDE 2
data Maybe a = Nothing | Just a data List a = Nil | Cons a (List a) data Either a b = Left a | Right b
SLIDE 3
Wh Which da datatype ype de declarations ns sh should be e ac accepted?
Wh What ki kinds do do accep accepted ed da datatypes pes ha have? e?
SLIDE 4
SLIDE 5
Haskell98
data AppInt f = Mk (f Int) AppInt :: ?
SLIDE 6
Haskell98
data AppInt f = Mk (f Int) AppInt :: ? AppInt :: ∗ → ∗ → ∗
SLIDE 7
data Q1 a = MkQ1 data Q2 = MkQ2 (Q1 Maybe)
SLIDE 8 data Q1 a = MkQ1 data Q2 = MkQ2 (Q1 Maybe)
SLIDE 9 data Q1 a = MkQ1 data Q2 = MkQ2 (Q1 Maybe)
SLIDE 10
data Q1 a = MkQ1 Q2 data Q2 = MkQ2 (Q1 Maybe)
SLIDE 11 data Q1 a = MkQ1 Q2 data Q2 = MkQ2 (Q1 Maybe)
SLIDE 12 data Q1 a = MkQ1 Q2 data Q2 = MkQ2 (Q1 Maybe)
- - Q1 ∷ (∗ → ∗) → ∗
- - Accepted!
SLIDE 13
Modern Haskell
SLIDE 14
{-# LANGUAGE ExplicitForAll , PolyKinds , ExistentialQuantification , TypeInType , TypeApplications #-}
SLIDE 15
data X :: forall a (b::*->*). a b -> * data Y :: forall (c :: Maybe Bool). X c -> *
SLIDE 16
data X :: forall a (b::*->*). a b -> * data Y :: forall (c :: Maybe Bool). X c -> *
SLIDE 17
data X :: forall a (b::*->*). a b -> * data Y :: forall (c :: Maybe Bool). X c -> * a :: (∗ → ∗) → ∗ Kind mismatch!
SLIDE 18
data Q :: forall (a :: f b) (c :: k) . f c -> *
SLIDE 19
data Q :: forall (a :: f b) (c :: k) . f c -> *
SLIDE 20
data Q :: forall (a :: f b) (c :: k) . f c -> * data Q :: forall (f::?) (b::?) (k::?) forall (a :: f b) (c :: k) . f c -> *
SLIDE 21
data Q :: forall (a :: f b) (c :: k) . f c -> * c :: k k :: *
SLIDE 22
data Q :: forall (a :: f b) (c :: k) . f c -> * c :: k k :: * f :: k -> *
SLIDE 23
data Q :: forall (a :: f b) (c :: k) . f c -> * c :: k k :: * f :: k -> * b :: k
SLIDE 24
data Q :: forall (a :: f b) (c :: k) . f c -> * k :: * f :: k -> * b :: k
SLIDE 25
data Q :: forall (a :: f b) (c :: k) . f c -> * data Q :: forall (f::?) (b::?) (k::?) forall (a :: f b) (c :: k) . f c -> *
SLIDE 26
data Q :: forall (a :: f b) (c :: k) . f c -> * data Q :: forall (k::?) (f::?) (b::?) forall (a :: f b) (c :: k) . f c -> *
SLIDE 27
data Q :: forall (a :: f b) (c :: k) . f c -> * data Q :: forall (k::*) (f::k->*) (b::k) forall (a :: f b) (c :: k) . f c -> *
SLIDE 28
Inferring Datatypes
SLIDE 29 Inferring Datatypes
- If you are a type theorist…
SLIDE 30 Inferring Datatypes
- If you are a GHC hacker/developer…
- Further language extensions
- How our work relates to GHC