SlideShare ist ein Scribd-Unternehmen logo
1 von 40
Downloaden Sie, um offline zu lesen
Einf¨hrung
                   u
       Großraum GADTs
     Beispiele f¨r GADTs
                u
     Schlußbetrachtungen




                    GADTs
 Generalisierte Algebraische Datentypen


Sven Urbanski (svenurbanski@gmail.com)



Haskell User Group Hamburg 19.04.2012




                                          1
Einf¨hrung
                                u
                    Großraum GADTs
                  Beispiele f¨r GADTs
                             u
                  Schlußbetrachtungen

1   Einf¨hrung
        u
      Motivation
      ADTs
2   Großraum GADTs
      Phantomtypen
      Typeinschr¨nkungen
                  a
      Erweiterung der R¨ckgabetypen
                        u
3   Beispiele f¨r GADTs
               u
      Sichere Listen
      Gemischte Listen
      Abstrakte Syntaxb¨ume
                        a
      Vektoren
4   Schlußbetrachtungen
      Fazit
      Verwandtes: Associated Types
      Verwandtes: Dependent Types
                                         2
Einf¨hrung
                                 u
                     Großraum GADTs       Motivation
                   Beispiele f¨r GADTs
                              u           ADTs
                   Schlußbetrachtungen


Motivation



  Generalisierte Algebraische Datentypen
  (GADT, [g2t]) bieten:
   ⇒ Formulierung von Invarianten im Typsystem
   ⇒ Zus¨tzliche Typchecks
        a
   ⇒ weniger Laufzeitfehler




                                                       3
Einf¨hrung
                                  u
                      Großraum GADTs       Motivation
                    Beispiele f¨r GADTs
                               u           ADTs
                    Schlußbetrachtungen


ADT


  ⇒ Algebraische Datentypen
    ([a:de:te:] auch Summen-Datentypen):
 Beispiel:
  1   data X = X1 A | X2 B | ...



  ⇒ X ist der ADT
    X1, X2, ... sind Konstruktorfunktionen
    X ≈ die Menge aller Werte aus A, B, . . .
    X ≈ {a1, a2, a3, . . . , b1, b2, b3, . . .}
    |X | = |A| + |B| + . . .


                                                        4
Einf¨hrung
                                    u
                        Großraum GADTs       Motivation
                      Beispiele f¨r GADTs
                                 u           ADTs
                      Schlußbetrachtungen


Anwendungsf¨lle
           a



   ⇒ beliebig viele
   ⇒ uberall, wo im Datentyp verschiedene F¨lle unterschieden
     ¨                                     a
     werden
  Beispiel:
   1   data Expr = IExpr Int
   2             | BExpr Bool
   3             | AndExpr Expr Expr




                                                                5
Einf¨hrung
                                   u
                                            Phantomtypen
                       Großraum GADTs
                                            Typeinschr¨nkungen
                                                      a
                     Beispiele f¨r GADTs
                                u
                                            Erweiterung der R¨ckgabetypen
                                                             u
                     Schlußbetrachtungen


Phantomtypen


  Normale Typparameter:
   1   data List a = Nil
   2               | Cons a (List a)



  Typparameter, die scheinbar nicht genutzt werden:
   1   data PList a b = PNil
   2                  | PCons a (PList a b)




                                                                            6
Einf¨hrung
                                   u
                                            Phantomtypen
                       Großraum GADTs
                                            Typeinschr¨nkungen
                                                      a
                     Beispiele f¨r GADTs
                                u
                                            Erweiterung der R¨ckgabetypen
                                                             u
                     Schlußbetrachtungen


Phantomtypen

  Zur Erinnerung:
   1   data PList a b = PNil
   2                  | PCons a (PList a b)



  Vorteil: Listen mit unterschiedlicher Semantik k¨nnen nicht mehr
                                                  o
  gemischt werden
  Beispiel:
   1   data Euro = ...
   2   data USD = ...
   3   euroToUsd :: PList a Euro -> PList a USD




                                                                            7
Einf¨hrung
                                   u
                                            Phantomtypen
                       Großraum GADTs
                                            Typeinschr¨nkungen
                                                      a
                     Beispiele f¨r GADTs
                                u
                                            Erweiterung der R¨ckgabetypen
                                                             u
                     Schlußbetrachtungen


Einschr¨nkungen der Typparameter
       a


  In Java:
   1   interface NumList<A>
   2   class NCons<A extends Number> implements NumList<A>
   3   class NNil ...



  In Haskell:
   1   data NumList a = NNil
   2                  | Num a => NCons a (NumList a)




                                                                            8
Einf¨hrung
                                   u
                                            Phantomtypen
                       Großraum GADTs
                                            Typeinschr¨nkungen
                                                      a
                     Beispiele f¨r GADTs
                                u
                                            Erweiterung der R¨ckgabetypen
                                                             u
                     Schlußbetrachtungen


Syntax GADTs

  Alte Syntax (ADTs):
   1   data List a = Nil
   2               | Cons a (List a)



  Neue Syntax:
   1   data List a where
   2     Nil :: List a
   3     Cons :: a -> (List a) -> List a



  Nil ist eine Funktion ohne Parameter.
  Cons ist eine Funktion mit zwei Parametern.
  Gemeinsamkeiten?
                                                                            9
Einf¨hrung
                                           u
                                                      Phantomtypen
                               Großraum GADTs
                                                      Typeinschr¨nkungen
                                                                a
                             Beispiele f¨r GADTs
                                        u
                                                      Erweiterung der R¨ckgabetypen
                                                                       u
                             Schlußbetrachtungen


Erweiterung durch GADTs


  Willk¨rliche Beispiele:
       u
   1   Cons1   ::   a   ->   (List   a)   ->   List    a
   2   Cons2   ::   a   ->   (List   a)   ->   List    (a,a)
   3   Cons3   ::   a   ->   (List   a)   ->   List    (List a)
   4   Cons4   ::   a   ->   (List   a)   ->   a --    err



   ⇒ Welchen Vorteil bringt das?
   ⇒ Mehr Typchecks
   ⇒ Aber wie sinnvoll einsetzen?



                                                                                      10
Einf¨hrung
                                   u        Sichere Listen
                       Großraum GADTs       Gemischte Listen
                     Beispiele f¨r GADTs
                                u           Abstrakte Syntaxb¨ume
                                                             a
                     Schlußbetrachtungen    Vektoren


Sichere Listen


   ⇒ Was bedeutet “sicher”?
   ⇒ Typ-Unterscheidung zur Compilezeit:
     Leere / Nicht leere Listen (genauer: L¨nge der Liste)
                                           a
   ⇒ Sinnvoll f¨r partiell definierte Funktionen wie head und tail
               u

  Beispiel:
   1   data Safe a = Safe a
   2   data NotSafe = NotSafe
   3   data SafeList a b where
   4     Nil :: SafeList a NotSafe
   5     Cons :: a -> SafeList a b -> SafeList a (Safe b)




                                                                    11
Einf¨hrung
                                       u        Sichere Listen
                           Großraum GADTs       Gemischte Listen
                         Beispiele f¨r GADTs
                                    u           Abstrakte Syntaxb¨ume
                                                                 a
                         Schlußbetrachtungen    Vektoren


Typ von sicheren Listen

  Zur Erinnerung:
   1   data SafeList a b where
   2     Nil :: SafeList a NotSafe
   3     Cons :: a -> SafeList a b -> SafeList a (Safe b)



  Bedeutung der Typparameter:
   1   SafeList   a   NotSafe                        --   leere Liste
   2   SafeList   a   (Safe NotSafe)                 --   Laenge == 1
   3   SafeList   a   (Safe b)                       --   Laenge >= 1
   4   SafeList   a   (Safe (Safe NotSafe))          --   Laenge == 2
   5   SafeList   a   (Safe (Safe b))                --   Laenge >= 2
   6   SafeList   a   b                              --   Laenge beliebig
   7   ...                                           --   Laenge n ???
   8



                                                                            12
Einf¨hrung
                                   u        Sichere Listen
                       Großraum GADTs       Gemischte Listen
                     Beispiele f¨r GADTs
                                u           Abstrakte Syntaxb¨ume
                                                             a
                     Schlußbetrachtungen    Vektoren


Funktionen mit sicheren Listen: safeHead


  Zur Erinnerung:
   1   data SafeList a b where
   2     Nil :: SafeList a NotSafe
   3     Cons :: a -> SafeList a b -> SafeList a (Safe b)



  Sicher:
   1   safeHead :: SafeList a (Safe b) -> a
   2   safeHead (Cons x _) = x
   3   -- safeHead Nil = ???




                                                                    13
Einf¨hrung
                                   u        Sichere Listen
                       Großraum GADTs       Gemischte Listen
                     Beispiele f¨r GADTs
                                u           Abstrakte Syntaxb¨ume
                                                             a
                     Schlußbetrachtungen    Vektoren


Funktionen mit sicheren Listen: unsafeHead


  Zur Erinnerung:
   1   data SafeList a b where
   2     Nil :: SafeList a NotSafe
   3     Cons :: a -> SafeList a b -> SafeList a (Safe b)



  Unsicher:
   1   unsafeHead :: SafeList a b -> a
   2   unsafeHead (Cons x _) = x
   3   unsafeHead Nil = error "error in head!"




                                                                    14
Einf¨hrung
                                   u        Sichere Listen
                       Großraum GADTs       Gemischte Listen
                     Beispiele f¨r GADTs
                                u           Abstrakte Syntaxb¨ume
                                                             a
                     Schlußbetrachtungen    Vektoren


Funktionen mit sicheren Listen: tail


  Zur Erinnerung:
   1   data SafeList a b where
   2     Nil :: SafeList a NotSafe
   3     Cons :: a -> SafeList a b -> SafeList a (Safe b)



  Beispiel:
   1   safeTail :: SafeList a (Safe b) -> SafeList a b
   2   safeTail (Cons _ t) = t




                                                                    15
Einf¨hrung
                                   u        Sichere Listen
                       Großraum GADTs       Gemischte Listen
                     Beispiele f¨r GADTs
                                u           Abstrakte Syntaxb¨ume
                                                             a
                     Schlußbetrachtungen    Vektoren


Funktionen mit sicheren Listen: access


  Zur Erinnerung:
   1   data SafeList a b where
   2     Nil :: SafeList a NotSafe
   3     Cons :: a -> SafeList a b -> SafeList a (Safe b)



  Sicherer Zugriff?
   1   accessN :: Int
   2              -> SafeList a (Safe (Safe (Safe ...)))
   3              -> a




                                                                    16
Einf¨hrung
                                   u        Sichere Listen
                       Großraum GADTs       Gemischte Listen
                     Beispiele f¨r GADTs
                                u           Abstrakte Syntaxb¨ume
                                                             a
                     Schlußbetrachtungen    Vektoren


Funktionen mit sicheren Listen: map/fold

   ⇒ Was ist mit total definierten Funktionen wie map oder fold?
   ⇒ Kein Problem!
  map:
   1   safeMap :: SafeList a c -> (a -> b) -> SafeList b c
   2   safeMap (Cons e t) f = Cons (f e) (safeMap t f)
   3   safeMap (Nil) _ = Nil



  fold:
   1   fold :: (a -> b -> a) -> a -> SafeList b c -> a
   2   fold f start (Nil) = start
   3   fold f start (Cons e t) = fold f (f start e) t



                                                                    17
Einf¨hrung
                                     u        Sichere Listen
                         Großraum GADTs       Gemischte Listen
                       Beispiele f¨r GADTs
                                  u           Abstrakte Syntaxb¨ume
                                                               a
                       Schlußbetrachtungen    Vektoren


Funktionen mit sicheren Listen: zip

  Zur Erinnerung:
   1     data SafeList a b where
   2       Nil :: SafeList a NotSafe
   3       Cons :: a -> SafeList a b -> SafeList a (Safe b)



  zip:
   1     safeZip :: SafeList a len -> SafeList b len
   2             -> SafeList (a,b) len
   3     safeZip Nil Nil = Nil
   4     safeZip (Cons e1 l1) (Cons e2 l2) =
   5         Cons (e1,e2) (safeZip l1 l2)




                                                                      18
Einf¨hrung
                                   u        Sichere Listen
                       Großraum GADTs       Gemischte Listen
                     Beispiele f¨r GADTs
                                u           Abstrakte Syntaxb¨ume
                                                             a
                     Schlußbetrachtungen    Vektoren


Funktionen mit sicheren Listen: Konvertierung 1


  Zur Erinnerung:
   1   data SafeList a b where
   2     Nil :: SafeList a NotSafe
   3     Cons :: a -> SafeList a b -> SafeList a (Safe b)



  Unsichere Liste → Sichere Liste
   1   makeSafe1 :: SafeList a b
   2                -> Maybe (SafeList a (Safe b))
   3   makeSafe1 Nil = Nothing
   4   makeSafe1 (Cons e l) = Just (Cons e l) --- ???




                                                                    19
Einf¨hrung
                                   u        Sichere Listen
                       Großraum GADTs       Gemischte Listen
                     Beispiele f¨r GADTs
                                u           Abstrakte Syntaxb¨ume
                                                             a
                     Schlußbetrachtungen    Vektoren


Funktionen mit sicheren Listen: Konvertierung 2


  Zur Erinnerung:
   1   data SafeList a b where
   2     Nil :: SafeList a NotSafe
   3     Cons :: a -> SafeList a b -> SafeList a (Safe b)



  Sichere Liste → Unsichere Liste
   1   makeUnsafe :: SafeList a (Safe b)
   2                 -> SafeList a b
   3   makeUnsafe (Cons e l) = Cons e l -- ???



  Sinnvoll?

                                                                    20
Einf¨hrung
                                   u        Sichere Listen
                       Großraum GADTs       Gemischte Listen
                     Beispiele f¨r GADTs
                                u           Abstrakte Syntaxb¨ume
                                                             a
                     Schlußbetrachtungen    Vektoren


Gemischte Listen


  Idee: Verschiedene Typen in einer Liste
  Beispiel:
   1   data MixList a b where
   2     MNil :: MixList a ()
   3     MCons :: (Show c, Show b) =>
   4           a -> MixList b c -> MixList a (MixList b c)



   ⇒ a ist der Typ des ersten Elements
   ⇒ b ist der Typ der Restliste



                                                                    21
Einf¨hrung
                                   u        Sichere Listen
                       Großraum GADTs       Gemischte Listen
                     Beispiele f¨r GADTs
                                u           Abstrakte Syntaxb¨ume
                                                             a
                     Schlußbetrachtungen    Vektoren


Gemischte Listen

  Zur Erinnerung:
   1   data MixList a b where
   2     MNil :: MixList a ()
   3     MCons :: (Show c, Show b) =>
   4           a -> MixList b c -> MixList a (MixList b c)



  Beispiel:
   1   > MCons 42 (MCons "hallo" MNil)
   2   42 : "hallo" : []
   3   > :t MCons 42 (MCons "hallo" MNil)
   4   MixList t (MixList [Char] (MixList b ()))




                                                                    22
Einf¨hrung
                                   u        Sichere Listen
                       Großraum GADTs       Gemischte Listen
                     Beispiele f¨r GADTs
                                u           Abstrakte Syntaxb¨ume
                                                             a
                     Schlußbetrachtungen    Vektoren


Unsichere Ausdrucksb¨ume (ADT)
                    a
  ADT:
   1   data Expr = IntLiteral Int
   2             | BoolLiteral Bool
   3             | AndExpr Expr Expr
   4   inv :: Expr -> Bool
   5   inv (BoolLiteral _) = True
   6   inv (IntLiteral _) = True
   7   inv (AndExpr l r)    = isInt l && isInt r
   8                          ‘or‘ isBool l && isBool r
   9   -- isBool, isInt ...



   ⇒ Umst¨ndliche Definition der Invariante (bei vielen
           a
     Konstruktorfunktionen)
   ⇒ Kann mit ADT nur zur Laufzeit uberpr¨ft werden
                                      ¨     u
   ⇒ Ziel: Invariante durch Compiler uberpr¨fen lassen
                                     ¨     u
                                                                    23
Einf¨hrung
                                   u        Sichere Listen
                       Großraum GADTs       Gemischte Listen
                     Beispiele f¨r GADTs
                                u           Abstrakte Syntaxb¨ume
                                                             a
                     Schlußbetrachtungen    Vektoren


Sichere Ausdrucksb¨ume (GADT)
                  a


  GADT:
   1   data Expr a where
   2     I     :: Int -> Expr Int
   3     B     :: Bool -> Expr Bool
   4     And   :: Expr Bool -> Expr Bool -> Expr Bool



   ⇒ Invariante?
   ⇒ Langweilig: Ausdrucksb¨ume bestehen nur aus Ints oder nur
                           a
     aus Bools
   ⇒ Erweiterung: Vergleich und Addition


                                                                    24
Einf¨hrung
                                   u        Sichere Listen
                       Großraum GADTs       Gemischte Listen
                     Beispiele f¨r GADTs
                                u           Abstrakte Syntaxb¨ume
                                                             a
                     Schlußbetrachtungen    Vektoren


Sichere Ausdrucksb¨ume (GADT)
                  a


  Erweiterung:
   1   data Expr a where
   2     I     :: Int -> Expr Int
   3     B     :: Bool -> Expr Bool
   4     And   :: Expr Bool -> Expr Bool -> Expr Bool
   5     Equal :: (Show a, Eq a) =>
   6              Expr a -> Expr a -> Expr Bool
   7     Add   :: Expr Int -> Expr Int -> Expr Int



   ⇒ Mischung von Ints und Bools und Invariante erf¨llt
                                                   u



                                                                    25
Einf¨hrung
                                     u        Sichere Listen
                         Großraum GADTs       Gemischte Listen
                       Beispiele f¨r GADTs
                                  u           Abstrakte Syntaxb¨ume
                                                               a
                       Schlußbetrachtungen    Vektoren


Sichere Ausdrucksb¨ume: eval
                  a
  Zur Erinnerung:
   1   data Expr a where
   2     I     :: Int -> Expr Int
   3     B     :: Bool -> Expr Bool
   4     And   :: Expr Bool -> Expr Bool -> Expr Bool
   5     Equal :: Eq a => Expr a -> Expr a -> Expr Bool
   6     Add   :: Expr Int -> Expr Int -> Expr Int



  Auswertung:
   1   eval   :: Expr a -> a
   2   eval   (I i)       = i
   3   eval   (B b)       = b
   4   eval   (And l r)   = eval l && eval r
   5   eval   (Equal l r) = eval l == eval r
   6   eval   (Add l r)   = eval l + eval r


                                                                      26
Einf¨hrung
                                     u        Sichere Listen
                         Großraum GADTs       Gemischte Listen
                       Beispiele f¨r GADTs
                                  u           Abstrakte Syntaxb¨ume
                                                               a
                       Schlußbetrachtungen    Vektoren


Sichere Ausdrucksb¨ume: optimize
                  a

  Zur Erinnerung:
   1   data Expr a where
   2     I     :: Int -> Expr Int
   3     B     :: Bool -> Expr Bool
   4     And   :: Expr Bool -> Expr Bool -> Expr Bool
   5     Equal :: Eq a => Expr a -> Expr a -> Expr Bool
   6     Add   :: Expr Int -> Expr Int -> Expr Int



  optimize:
   1   optimize   :: Expr a -> Expr a
   2   optimize   (And (B True) r) = optimize r
   3   optimize   (And l r) = And (optimize l) (optimize r)
   4   optimize   x = x



                                                                      27
Einf¨hrung
                                   u        Sichere Listen
                       Großraum GADTs       Gemischte Listen
                     Beispiele f¨r GADTs
                                u           Abstrakte Syntaxb¨ume
                                                             a
                     Schlußbetrachtungen    Vektoren


Vektoren
  Beispiel:
   1   data Zero
   2   data Next a
   3   data Vec e n where
   4     NullVec :: Vec e Zero
   5     NextVec :: e -> Vec e n -> Vec e (Next n)



  Konvertierung:
   1   v2l :: Vec e n -> [e]
   2   v2l NullVec = []
   3   v2l (NextVec e l) = e : v2l l
   4
   5   l2v :: [e] -> Vec e n
   6   l2v []    = NullVec
   7   l2v (e:l) = NextVec e (l2v l) -- ???


                                                                    28
Einf¨hrung
                                   u        Sichere Listen
                       Großraum GADTs       Gemischte Listen
                     Beispiele f¨r GADTs
                                u           Abstrakte Syntaxb¨ume
                                                             a
                     Schlußbetrachtungen    Vektoren


Vektorfunktionen: Skalarprodukt

  Zur Erinnerung:
   1   data Zero
   2   data Next a
   3   data Vec e n where
   4     NullVec :: Vec e Zero
   5     NextVec :: e -> Vec e n -> Vec e (Next n)



  Skalarprodukt:
   1   dot :: Vec Int n -> Vec Int n -> Int
   2   dot NullVec NullVec = 0
   3   dot (NextVec e1 l1) (NextVec e2 l2) = e1 * e2 + dot l1 l2




                                                                    29
Einf¨hrung
                                   u        Sichere Listen
                       Großraum GADTs       Gemischte Listen
                     Beispiele f¨r GADTs
                                u           Abstrakte Syntaxb¨ume
                                                             a
                     Schlußbetrachtungen    Vektoren


Vektorfunktionen: Konkatenation

  Zur Erinnerung:
   1   data Zero
   2   data Next a
   3   data Vec e n where
   4     NullVec :: Vec e Zero
   5     NextVec :: e -> Vec e n -> Vec e (Next n)



  Konkatenation:
   1   concatV :: Vec e n1 -> Vec e n2 -> Vec e n3 -- ???
   2   concatV NullVec x         = x
   3   concatV (NextVec e1 l1) x = NextVec e1 (concatV l1 x)




                                                                    30
Einf¨hrung
                                   u        Sichere Listen
                       Großraum GADTs       Gemischte Listen
                     Beispiele f¨r GADTs
                                u           Abstrakte Syntaxb¨ume
                                                             a
                     Schlußbetrachtungen    Vektoren


Vektoren – zweiter Versuch:


  Beispiel:
   1   data Wec e n where
   2     Wec :: [e] -> Wec e n



  Konvertierung:
   1   w2l :: Wec e n -> [e]
   2   w2l (Wec l) = l
   3
   4   l2w :: [e] -> Wec e n
   5   l2w l = Wec l




                                                                    31
Einf¨hrung
                                   u        Sichere Listen
                       Großraum GADTs       Gemischte Listen
                     Beispiele f¨r GADTs
                                u           Abstrakte Syntaxb¨ume
                                                             a
                     Schlußbetrachtungen    Vektoren


Vektoren – zweiter Versuch: Invariante


  Zur Erinnerung:
   1   data Wec e n where
   2     Wec :: [e] -> Wec e n



  Eigene Konstruktorfunktion:
   1   w3 :: [e] -> Wec e (Next (Next (Next Zero)))
   2   w3 e = assert (length e == 3) (Wec e)




                                                                    32
Einf¨hrung
                                       u        Sichere Listen
                           Großraum GADTs       Gemischte Listen
                         Beispiele f¨r GADTs
                                    u           Abstrakte Syntaxb¨ume
                                                                 a
                         Schlußbetrachtungen    Vektoren


Vektoren – dritter Versuch:



  Beispiel:
   1   data WecN   e   n where
   2     Wec1 ::   e   -> WecN e (Next Zero)
   3     Wec2 ::   e   -> e -> WecN e (Next (Next Zero))
   4     Wec3 ::   e   -> e -> e -> WecN e (Next (Next (Next Zero)))
   5     -- ...



   ≈ Praktikabel?




                                                                        33
Einf¨hrung
                                     u
                                              Fazit
                         Großraum GADTs
                                              Verwandtes: Associated Types
                       Beispiele f¨r GADTs
                                  u
                                              Verwandtes: Dependent Types
                       Schlußbetrachtungen


Fazit



    + Mehr Typsicherheit
    + Weniger Laufzeitfehler
    + Geschicktere Invarianten
    + Partielle Funktion ⇒ totale Funktion
    ≈ . . . aber nicht alle
    ≈ Nur bei bestimmten Datenstrukturen sinnvoll einsetzbar




                                                                             34
Einf¨hrung
                                   u
                                            Fazit
                       Großraum GADTs
                                            Verwandtes: Associated Types
                     Beispiele f¨r GADTs
                                u
                                            Verwandtes: Dependent Types
                     Schlußbetrachtungen


Associated Types (1)

     ⇒ Funktionen uber Typen
                  ¨
     ⇒ Erweiterung von Typklassen

Herk¨mmliche Num-Typklasse:
    o                                       Neue Num-Typklasse:
 1   class Num a where                        1   class MyNum a b where
 2     (+++) :: a -> a -> a                   2     type Sum a b :: *
 3                                            3     (+++) :: a -> b -> Sum a b
 4                                            4
 5   instance Num Int where                   5   instance MyNum Int Int where
 6     (+++) x y = x + y                      6     type Sum Int Int = Int
 7                                            7     (+++) x y = x + y



     ⇒ Sum ist eine Funktion mit 2 Typen als Parameter und einem
       Typ als R¨ckgabewert
                u
                                                                                 35
Einf¨hrung
                                   u
                                            Fazit
                       Großraum GADTs
                                            Verwandtes: Associated Types
                     Beispiele f¨r GADTs
                                u
                                            Verwandtes: Dependent Types
                     Schlußbetrachtungen


Associated Types (2)

  Zur Erinnerung:
   1   class MyNum a b where
   2     type Sum a b :: *
   3     (+++) :: a -> b -> Sum a b



  MyNum Float Int:
   1   instance Integral a => MyNum Float a where
   2       type Sum Float a = Float
   3       (+++) x y = x + intToFloat y



   ⇒ Floats und Ints addieren!
   ≈ Ints und Floats?
                                                                           36
Einf¨hrung
                                   u
                                            Fazit
                       Großraum GADTs
                                            Verwandtes: Associated Types
                     Beispiele f¨r GADTs
                                u
                                            Verwandtes: Dependent Types
                     Schlußbetrachtungen


Associated Types (3)

  Zur Erinnerung:
   1   class MyNum a b where
   2     type Sum a b :: *
   3     (+++) :: a -> b -> Sum a b



  MyNum Int Float:
   1   instance Integral a => MyNum a Float where
   2       type Sum a Float = Float
   3       (+++) x y = y +++ x



   ⇒ nun ist +++ kommutativ!

                                                                           37
Einf¨hrung
                                u
                                         Fazit
                    Großraum GADTs
                                         Verwandtes: Associated Types
                  Beispiele f¨r GADTs
                             u
                                         Verwandtes: Dependent Types
                  Schlußbetrachtungen


Dependent Types (1)




   ⇒ Typen, die von Werten abh¨ngen
                              a
   ⇒ Agda




                                                                        38
Einf¨hrung
                                    u
                                             Fazit
                        Großraum GADTs
                                             Verwandtes: Associated Types
                      Beispiele f¨r GADTs
                                 u
                                             Verwandtes: Dependent Types
                      Schlußbetrachtungen


Dependent Types (2)



  Willk¨rliches Beispiel:
       u
  q : ΣN (λx → if x = 1 then N else Bool)

  Werte f¨r q:
         u
  q = 4, true
  q = 1, 42




                                                                            39
Einf¨hrung
                                   u
                                            Fazit
                       Großraum GADTs
                                            Verwandtes: Associated Types
                     Beispiele f¨r GADTs
                                u
                                            Verwandtes: Dependent Types
                     Schlußbetrachtungen


Dependent Types (3)



   ⇒ noch genauere Typ¨berp¨fungen / Invarianten
                      u    u
     z.B.:
          Vektoren (auch mit GADTs)
          Matrizen (m × n → n × o → m × o)
          Bin¨re B¨ume (links < mitte < rechts)
             a    a
   ≈ Vermischung Typ/Wert
   ≈ Endlosschleifen im Typsystem
   ≈ Typgleichheit




                                                                           40

Weitere ähnliche Inhalte

Andere mochten auch

Qd 100 2005 4 cm dot 5
Qd 100 2005 4 cm dot 5Qd 100 2005 4 cm dot 5
Qd 100 2005 4 cm dot 5Hoàng Ân
 
09 GMW Workshop E Assessment
09 GMW Workshop E Assessment09 GMW Workshop E Assessment
09 GMW Workshop E AssessmentCornelia Ruedel
 
CP Le design tchèque à la reconquête du monde
CP Le design tchèque à la reconquête du mondeCP Le design tchèque à la reconquête du monde
CP Le design tchèque à la reconquête du mondeRPKONFIDENTIELLES
 
Virtualização de Máquinas: Uma experiência baseada em ferramentas livres - Ca...
Virtualização de Máquinas: Uma experiência baseada em ferramentas livres - Ca...Virtualização de Máquinas: Uma experiência baseada em ferramentas livres - Ca...
Virtualização de Máquinas: Uma experiência baseada em ferramentas livres - Ca...Tchelinux
 
Jingle : les sessions multimédia sur XMPP/Jabber
Jingle : les sessions multimédia sur XMPP/JabberJingle : les sessions multimédia sur XMPP/Jabber
Jingle : les sessions multimédia sur XMPP/JabberNyco
 
Vorstellung Schulfirma
Vorstellung SchulfirmaVorstellung Schulfirma
Vorstellung SchulfirmaGerhard Henne
 
TU Wien Gastvortrag 07.06.2010, Michaela Mayr
TU Wien Gastvortrag 07.06.2010, Michaela MayrTU Wien Gastvortrag 07.06.2010, Michaela Mayr
TU Wien Gastvortrag 07.06.2010, Michaela MayrWeb@rchive Austria
 
Apresentação sem título (1)
Apresentação sem título (1)Apresentação sem título (1)
Apresentação sem título (1)Milena Santos
 
Clube do herbert polar bear
Clube do herbert polar bearClube do herbert polar bear
Clube do herbert polar bearVictor Gabriel
 

Andere mochten auch (18)

Café numerique musique en ligne
Café numerique musique en ligneCafé numerique musique en ligne
Café numerique musique en ligne
 
Relooking stratégique
Relooking stratégiqueRelooking stratégique
Relooking stratégique
 
I-DOT Job Offer 1991
I-DOT Job Offer 1991I-DOT Job Offer 1991
I-DOT Job Offer 1991
 
Qd 100 2005 4 cm dot 5
Qd 100 2005 4 cm dot 5Qd 100 2005 4 cm dot 5
Qd 100 2005 4 cm dot 5
 
Dot dot-seurat
Dot dot-seuratDot dot-seurat
Dot dot-seurat
 
DOT digital group
DOT digital groupDOT digital group
DOT digital group
 
09 GMW Workshop E Assessment
09 GMW Workshop E Assessment09 GMW Workshop E Assessment
09 GMW Workshop E Assessment
 
CP Le design tchèque à la reconquête du monde
CP Le design tchèque à la reconquête du mondeCP Le design tchèque à la reconquête du monde
CP Le design tchèque à la reconquête du monde
 
Virtualização de Máquinas: Uma experiência baseada em ferramentas livres - Ca...
Virtualização de Máquinas: Uma experiência baseada em ferramentas livres - Ca...Virtualização de Máquinas: Uma experiência baseada em ferramentas livres - Ca...
Virtualização de Máquinas: Uma experiência baseada em ferramentas livres - Ca...
 
Jingle : les sessions multimédia sur XMPP/Jabber
Jingle : les sessions multimédia sur XMPP/JabberJingle : les sessions multimédia sur XMPP/Jabber
Jingle : les sessions multimédia sur XMPP/Jabber
 
Documentos da rede e mec
Documentos da rede e mecDocumentos da rede e mec
Documentos da rede e mec
 
Vorstellung Schulfirma
Vorstellung SchulfirmaVorstellung Schulfirma
Vorstellung Schulfirma
 
Dot of music
Dot of musicDot of music
Dot of music
 
Apresentação T-Scan
Apresentação T-ScanApresentação T-Scan
Apresentação T-Scan
 
TU Wien Gastvortrag 07.06.2010, Michaela Mayr
TU Wien Gastvortrag 07.06.2010, Michaela MayrTU Wien Gastvortrag 07.06.2010, Michaela Mayr
TU Wien Gastvortrag 07.06.2010, Michaela Mayr
 
Apresentação sem título (1)
Apresentação sem título (1)Apresentação sem título (1)
Apresentação sem título (1)
 
Clube do herbert polar bear
Clube do herbert polar bearClube do herbert polar bear
Clube do herbert polar bear
 
Expo Limahack
Expo LimahackExpo Limahack
Expo Limahack
 

GADTs Einführung

  • 1. Einf¨hrung u Großraum GADTs Beispiele f¨r GADTs u Schlußbetrachtungen GADTs Generalisierte Algebraische Datentypen Sven Urbanski (svenurbanski@gmail.com) Haskell User Group Hamburg 19.04.2012 1
  • 2. Einf¨hrung u Großraum GADTs Beispiele f¨r GADTs u Schlußbetrachtungen 1 Einf¨hrung u Motivation ADTs 2 Großraum GADTs Phantomtypen Typeinschr¨nkungen a Erweiterung der R¨ckgabetypen u 3 Beispiele f¨r GADTs u Sichere Listen Gemischte Listen Abstrakte Syntaxb¨ume a Vektoren 4 Schlußbetrachtungen Fazit Verwandtes: Associated Types Verwandtes: Dependent Types 2
  • 3. Einf¨hrung u Großraum GADTs Motivation Beispiele f¨r GADTs u ADTs Schlußbetrachtungen Motivation Generalisierte Algebraische Datentypen (GADT, [g2t]) bieten: ⇒ Formulierung von Invarianten im Typsystem ⇒ Zus¨tzliche Typchecks a ⇒ weniger Laufzeitfehler 3
  • 4. Einf¨hrung u Großraum GADTs Motivation Beispiele f¨r GADTs u ADTs Schlußbetrachtungen ADT ⇒ Algebraische Datentypen ([a:de:te:] auch Summen-Datentypen): Beispiel: 1 data X = X1 A | X2 B | ... ⇒ X ist der ADT X1, X2, ... sind Konstruktorfunktionen X ≈ die Menge aller Werte aus A, B, . . . X ≈ {a1, a2, a3, . . . , b1, b2, b3, . . .} |X | = |A| + |B| + . . . 4
  • 5. Einf¨hrung u Großraum GADTs Motivation Beispiele f¨r GADTs u ADTs Schlußbetrachtungen Anwendungsf¨lle a ⇒ beliebig viele ⇒ uberall, wo im Datentyp verschiedene F¨lle unterschieden ¨ a werden Beispiel: 1 data Expr = IExpr Int 2 | BExpr Bool 3 | AndExpr Expr Expr 5
  • 6. Einf¨hrung u Phantomtypen Großraum GADTs Typeinschr¨nkungen a Beispiele f¨r GADTs u Erweiterung der R¨ckgabetypen u Schlußbetrachtungen Phantomtypen Normale Typparameter: 1 data List a = Nil 2 | Cons a (List a) Typparameter, die scheinbar nicht genutzt werden: 1 data PList a b = PNil 2 | PCons a (PList a b) 6
  • 7. Einf¨hrung u Phantomtypen Großraum GADTs Typeinschr¨nkungen a Beispiele f¨r GADTs u Erweiterung der R¨ckgabetypen u Schlußbetrachtungen Phantomtypen Zur Erinnerung: 1 data PList a b = PNil 2 | PCons a (PList a b) Vorteil: Listen mit unterschiedlicher Semantik k¨nnen nicht mehr o gemischt werden Beispiel: 1 data Euro = ... 2 data USD = ... 3 euroToUsd :: PList a Euro -> PList a USD 7
  • 8. Einf¨hrung u Phantomtypen Großraum GADTs Typeinschr¨nkungen a Beispiele f¨r GADTs u Erweiterung der R¨ckgabetypen u Schlußbetrachtungen Einschr¨nkungen der Typparameter a In Java: 1 interface NumList<A> 2 class NCons<A extends Number> implements NumList<A> 3 class NNil ... In Haskell: 1 data NumList a = NNil 2 | Num a => NCons a (NumList a) 8
  • 9. Einf¨hrung u Phantomtypen Großraum GADTs Typeinschr¨nkungen a Beispiele f¨r GADTs u Erweiterung der R¨ckgabetypen u Schlußbetrachtungen Syntax GADTs Alte Syntax (ADTs): 1 data List a = Nil 2 | Cons a (List a) Neue Syntax: 1 data List a where 2 Nil :: List a 3 Cons :: a -> (List a) -> List a Nil ist eine Funktion ohne Parameter. Cons ist eine Funktion mit zwei Parametern. Gemeinsamkeiten? 9
  • 10. Einf¨hrung u Phantomtypen Großraum GADTs Typeinschr¨nkungen a Beispiele f¨r GADTs u Erweiterung der R¨ckgabetypen u Schlußbetrachtungen Erweiterung durch GADTs Willk¨rliche Beispiele: u 1 Cons1 :: a -> (List a) -> List a 2 Cons2 :: a -> (List a) -> List (a,a) 3 Cons3 :: a -> (List a) -> List (List a) 4 Cons4 :: a -> (List a) -> a -- err ⇒ Welchen Vorteil bringt das? ⇒ Mehr Typchecks ⇒ Aber wie sinnvoll einsetzen? 10
  • 11. Einf¨hrung u Sichere Listen Großraum GADTs Gemischte Listen Beispiele f¨r GADTs u Abstrakte Syntaxb¨ume a Schlußbetrachtungen Vektoren Sichere Listen ⇒ Was bedeutet “sicher”? ⇒ Typ-Unterscheidung zur Compilezeit: Leere / Nicht leere Listen (genauer: L¨nge der Liste) a ⇒ Sinnvoll f¨r partiell definierte Funktionen wie head und tail u Beispiel: 1 data Safe a = Safe a 2 data NotSafe = NotSafe 3 data SafeList a b where 4 Nil :: SafeList a NotSafe 5 Cons :: a -> SafeList a b -> SafeList a (Safe b) 11
  • 12. Einf¨hrung u Sichere Listen Großraum GADTs Gemischte Listen Beispiele f¨r GADTs u Abstrakte Syntaxb¨ume a Schlußbetrachtungen Vektoren Typ von sicheren Listen Zur Erinnerung: 1 data SafeList a b where 2 Nil :: SafeList a NotSafe 3 Cons :: a -> SafeList a b -> SafeList a (Safe b) Bedeutung der Typparameter: 1 SafeList a NotSafe -- leere Liste 2 SafeList a (Safe NotSafe) -- Laenge == 1 3 SafeList a (Safe b) -- Laenge >= 1 4 SafeList a (Safe (Safe NotSafe)) -- Laenge == 2 5 SafeList a (Safe (Safe b)) -- Laenge >= 2 6 SafeList a b -- Laenge beliebig 7 ... -- Laenge n ??? 8 12
  • 13. Einf¨hrung u Sichere Listen Großraum GADTs Gemischte Listen Beispiele f¨r GADTs u Abstrakte Syntaxb¨ume a Schlußbetrachtungen Vektoren Funktionen mit sicheren Listen: safeHead Zur Erinnerung: 1 data SafeList a b where 2 Nil :: SafeList a NotSafe 3 Cons :: a -> SafeList a b -> SafeList a (Safe b) Sicher: 1 safeHead :: SafeList a (Safe b) -> a 2 safeHead (Cons x _) = x 3 -- safeHead Nil = ??? 13
  • 14. Einf¨hrung u Sichere Listen Großraum GADTs Gemischte Listen Beispiele f¨r GADTs u Abstrakte Syntaxb¨ume a Schlußbetrachtungen Vektoren Funktionen mit sicheren Listen: unsafeHead Zur Erinnerung: 1 data SafeList a b where 2 Nil :: SafeList a NotSafe 3 Cons :: a -> SafeList a b -> SafeList a (Safe b) Unsicher: 1 unsafeHead :: SafeList a b -> a 2 unsafeHead (Cons x _) = x 3 unsafeHead Nil = error "error in head!" 14
  • 15. Einf¨hrung u Sichere Listen Großraum GADTs Gemischte Listen Beispiele f¨r GADTs u Abstrakte Syntaxb¨ume a Schlußbetrachtungen Vektoren Funktionen mit sicheren Listen: tail Zur Erinnerung: 1 data SafeList a b where 2 Nil :: SafeList a NotSafe 3 Cons :: a -> SafeList a b -> SafeList a (Safe b) Beispiel: 1 safeTail :: SafeList a (Safe b) -> SafeList a b 2 safeTail (Cons _ t) = t 15
  • 16. Einf¨hrung u Sichere Listen Großraum GADTs Gemischte Listen Beispiele f¨r GADTs u Abstrakte Syntaxb¨ume a Schlußbetrachtungen Vektoren Funktionen mit sicheren Listen: access Zur Erinnerung: 1 data SafeList a b where 2 Nil :: SafeList a NotSafe 3 Cons :: a -> SafeList a b -> SafeList a (Safe b) Sicherer Zugriff? 1 accessN :: Int 2 -> SafeList a (Safe (Safe (Safe ...))) 3 -> a 16
  • 17. Einf¨hrung u Sichere Listen Großraum GADTs Gemischte Listen Beispiele f¨r GADTs u Abstrakte Syntaxb¨ume a Schlußbetrachtungen Vektoren Funktionen mit sicheren Listen: map/fold ⇒ Was ist mit total definierten Funktionen wie map oder fold? ⇒ Kein Problem! map: 1 safeMap :: SafeList a c -> (a -> b) -> SafeList b c 2 safeMap (Cons e t) f = Cons (f e) (safeMap t f) 3 safeMap (Nil) _ = Nil fold: 1 fold :: (a -> b -> a) -> a -> SafeList b c -> a 2 fold f start (Nil) = start 3 fold f start (Cons e t) = fold f (f start e) t 17
  • 18. Einf¨hrung u Sichere Listen Großraum GADTs Gemischte Listen Beispiele f¨r GADTs u Abstrakte Syntaxb¨ume a Schlußbetrachtungen Vektoren Funktionen mit sicheren Listen: zip Zur Erinnerung: 1 data SafeList a b where 2 Nil :: SafeList a NotSafe 3 Cons :: a -> SafeList a b -> SafeList a (Safe b) zip: 1 safeZip :: SafeList a len -> SafeList b len 2 -> SafeList (a,b) len 3 safeZip Nil Nil = Nil 4 safeZip (Cons e1 l1) (Cons e2 l2) = 5 Cons (e1,e2) (safeZip l1 l2) 18
  • 19. Einf¨hrung u Sichere Listen Großraum GADTs Gemischte Listen Beispiele f¨r GADTs u Abstrakte Syntaxb¨ume a Schlußbetrachtungen Vektoren Funktionen mit sicheren Listen: Konvertierung 1 Zur Erinnerung: 1 data SafeList a b where 2 Nil :: SafeList a NotSafe 3 Cons :: a -> SafeList a b -> SafeList a (Safe b) Unsichere Liste → Sichere Liste 1 makeSafe1 :: SafeList a b 2 -> Maybe (SafeList a (Safe b)) 3 makeSafe1 Nil = Nothing 4 makeSafe1 (Cons e l) = Just (Cons e l) --- ??? 19
  • 20. Einf¨hrung u Sichere Listen Großraum GADTs Gemischte Listen Beispiele f¨r GADTs u Abstrakte Syntaxb¨ume a Schlußbetrachtungen Vektoren Funktionen mit sicheren Listen: Konvertierung 2 Zur Erinnerung: 1 data SafeList a b where 2 Nil :: SafeList a NotSafe 3 Cons :: a -> SafeList a b -> SafeList a (Safe b) Sichere Liste → Unsichere Liste 1 makeUnsafe :: SafeList a (Safe b) 2 -> SafeList a b 3 makeUnsafe (Cons e l) = Cons e l -- ??? Sinnvoll? 20
  • 21. Einf¨hrung u Sichere Listen Großraum GADTs Gemischte Listen Beispiele f¨r GADTs u Abstrakte Syntaxb¨ume a Schlußbetrachtungen Vektoren Gemischte Listen Idee: Verschiedene Typen in einer Liste Beispiel: 1 data MixList a b where 2 MNil :: MixList a () 3 MCons :: (Show c, Show b) => 4 a -> MixList b c -> MixList a (MixList b c) ⇒ a ist der Typ des ersten Elements ⇒ b ist der Typ der Restliste 21
  • 22. Einf¨hrung u Sichere Listen Großraum GADTs Gemischte Listen Beispiele f¨r GADTs u Abstrakte Syntaxb¨ume a Schlußbetrachtungen Vektoren Gemischte Listen Zur Erinnerung: 1 data MixList a b where 2 MNil :: MixList a () 3 MCons :: (Show c, Show b) => 4 a -> MixList b c -> MixList a (MixList b c) Beispiel: 1 > MCons 42 (MCons "hallo" MNil) 2 42 : "hallo" : [] 3 > :t MCons 42 (MCons "hallo" MNil) 4 MixList t (MixList [Char] (MixList b ())) 22
  • 23. Einf¨hrung u Sichere Listen Großraum GADTs Gemischte Listen Beispiele f¨r GADTs u Abstrakte Syntaxb¨ume a Schlußbetrachtungen Vektoren Unsichere Ausdrucksb¨ume (ADT) a ADT: 1 data Expr = IntLiteral Int 2 | BoolLiteral Bool 3 | AndExpr Expr Expr 4 inv :: Expr -> Bool 5 inv (BoolLiteral _) = True 6 inv (IntLiteral _) = True 7 inv (AndExpr l r) = isInt l && isInt r 8 ‘or‘ isBool l && isBool r 9 -- isBool, isInt ... ⇒ Umst¨ndliche Definition der Invariante (bei vielen a Konstruktorfunktionen) ⇒ Kann mit ADT nur zur Laufzeit uberpr¨ft werden ¨ u ⇒ Ziel: Invariante durch Compiler uberpr¨fen lassen ¨ u 23
  • 24. Einf¨hrung u Sichere Listen Großraum GADTs Gemischte Listen Beispiele f¨r GADTs u Abstrakte Syntaxb¨ume a Schlußbetrachtungen Vektoren Sichere Ausdrucksb¨ume (GADT) a GADT: 1 data Expr a where 2 I :: Int -> Expr Int 3 B :: Bool -> Expr Bool 4 And :: Expr Bool -> Expr Bool -> Expr Bool ⇒ Invariante? ⇒ Langweilig: Ausdrucksb¨ume bestehen nur aus Ints oder nur a aus Bools ⇒ Erweiterung: Vergleich und Addition 24
  • 25. Einf¨hrung u Sichere Listen Großraum GADTs Gemischte Listen Beispiele f¨r GADTs u Abstrakte Syntaxb¨ume a Schlußbetrachtungen Vektoren Sichere Ausdrucksb¨ume (GADT) a Erweiterung: 1 data Expr a where 2 I :: Int -> Expr Int 3 B :: Bool -> Expr Bool 4 And :: Expr Bool -> Expr Bool -> Expr Bool 5 Equal :: (Show a, Eq a) => 6 Expr a -> Expr a -> Expr Bool 7 Add :: Expr Int -> Expr Int -> Expr Int ⇒ Mischung von Ints und Bools und Invariante erf¨llt u 25
  • 26. Einf¨hrung u Sichere Listen Großraum GADTs Gemischte Listen Beispiele f¨r GADTs u Abstrakte Syntaxb¨ume a Schlußbetrachtungen Vektoren Sichere Ausdrucksb¨ume: eval a Zur Erinnerung: 1 data Expr a where 2 I :: Int -> Expr Int 3 B :: Bool -> Expr Bool 4 And :: Expr Bool -> Expr Bool -> Expr Bool 5 Equal :: Eq a => Expr a -> Expr a -> Expr Bool 6 Add :: Expr Int -> Expr Int -> Expr Int Auswertung: 1 eval :: Expr a -> a 2 eval (I i) = i 3 eval (B b) = b 4 eval (And l r) = eval l && eval r 5 eval (Equal l r) = eval l == eval r 6 eval (Add l r) = eval l + eval r 26
  • 27. Einf¨hrung u Sichere Listen Großraum GADTs Gemischte Listen Beispiele f¨r GADTs u Abstrakte Syntaxb¨ume a Schlußbetrachtungen Vektoren Sichere Ausdrucksb¨ume: optimize a Zur Erinnerung: 1 data Expr a where 2 I :: Int -> Expr Int 3 B :: Bool -> Expr Bool 4 And :: Expr Bool -> Expr Bool -> Expr Bool 5 Equal :: Eq a => Expr a -> Expr a -> Expr Bool 6 Add :: Expr Int -> Expr Int -> Expr Int optimize: 1 optimize :: Expr a -> Expr a 2 optimize (And (B True) r) = optimize r 3 optimize (And l r) = And (optimize l) (optimize r) 4 optimize x = x 27
  • 28. Einf¨hrung u Sichere Listen Großraum GADTs Gemischte Listen Beispiele f¨r GADTs u Abstrakte Syntaxb¨ume a Schlußbetrachtungen Vektoren Vektoren Beispiel: 1 data Zero 2 data Next a 3 data Vec e n where 4 NullVec :: Vec e Zero 5 NextVec :: e -> Vec e n -> Vec e (Next n) Konvertierung: 1 v2l :: Vec e n -> [e] 2 v2l NullVec = [] 3 v2l (NextVec e l) = e : v2l l 4 5 l2v :: [e] -> Vec e n 6 l2v [] = NullVec 7 l2v (e:l) = NextVec e (l2v l) -- ??? 28
  • 29. Einf¨hrung u Sichere Listen Großraum GADTs Gemischte Listen Beispiele f¨r GADTs u Abstrakte Syntaxb¨ume a Schlußbetrachtungen Vektoren Vektorfunktionen: Skalarprodukt Zur Erinnerung: 1 data Zero 2 data Next a 3 data Vec e n where 4 NullVec :: Vec e Zero 5 NextVec :: e -> Vec e n -> Vec e (Next n) Skalarprodukt: 1 dot :: Vec Int n -> Vec Int n -> Int 2 dot NullVec NullVec = 0 3 dot (NextVec e1 l1) (NextVec e2 l2) = e1 * e2 + dot l1 l2 29
  • 30. Einf¨hrung u Sichere Listen Großraum GADTs Gemischte Listen Beispiele f¨r GADTs u Abstrakte Syntaxb¨ume a Schlußbetrachtungen Vektoren Vektorfunktionen: Konkatenation Zur Erinnerung: 1 data Zero 2 data Next a 3 data Vec e n where 4 NullVec :: Vec e Zero 5 NextVec :: e -> Vec e n -> Vec e (Next n) Konkatenation: 1 concatV :: Vec e n1 -> Vec e n2 -> Vec e n3 -- ??? 2 concatV NullVec x = x 3 concatV (NextVec e1 l1) x = NextVec e1 (concatV l1 x) 30
  • 31. Einf¨hrung u Sichere Listen Großraum GADTs Gemischte Listen Beispiele f¨r GADTs u Abstrakte Syntaxb¨ume a Schlußbetrachtungen Vektoren Vektoren – zweiter Versuch: Beispiel: 1 data Wec e n where 2 Wec :: [e] -> Wec e n Konvertierung: 1 w2l :: Wec e n -> [e] 2 w2l (Wec l) = l 3 4 l2w :: [e] -> Wec e n 5 l2w l = Wec l 31
  • 32. Einf¨hrung u Sichere Listen Großraum GADTs Gemischte Listen Beispiele f¨r GADTs u Abstrakte Syntaxb¨ume a Schlußbetrachtungen Vektoren Vektoren – zweiter Versuch: Invariante Zur Erinnerung: 1 data Wec e n where 2 Wec :: [e] -> Wec e n Eigene Konstruktorfunktion: 1 w3 :: [e] -> Wec e (Next (Next (Next Zero))) 2 w3 e = assert (length e == 3) (Wec e) 32
  • 33. Einf¨hrung u Sichere Listen Großraum GADTs Gemischte Listen Beispiele f¨r GADTs u Abstrakte Syntaxb¨ume a Schlußbetrachtungen Vektoren Vektoren – dritter Versuch: Beispiel: 1 data WecN e n where 2 Wec1 :: e -> WecN e (Next Zero) 3 Wec2 :: e -> e -> WecN e (Next (Next Zero)) 4 Wec3 :: e -> e -> e -> WecN e (Next (Next (Next Zero))) 5 -- ... ≈ Praktikabel? 33
  • 34. Einf¨hrung u Fazit Großraum GADTs Verwandtes: Associated Types Beispiele f¨r GADTs u Verwandtes: Dependent Types Schlußbetrachtungen Fazit + Mehr Typsicherheit + Weniger Laufzeitfehler + Geschicktere Invarianten + Partielle Funktion ⇒ totale Funktion ≈ . . . aber nicht alle ≈ Nur bei bestimmten Datenstrukturen sinnvoll einsetzbar 34
  • 35. Einf¨hrung u Fazit Großraum GADTs Verwandtes: Associated Types Beispiele f¨r GADTs u Verwandtes: Dependent Types Schlußbetrachtungen Associated Types (1) ⇒ Funktionen uber Typen ¨ ⇒ Erweiterung von Typklassen Herk¨mmliche Num-Typklasse: o Neue Num-Typklasse: 1 class Num a where 1 class MyNum a b where 2 (+++) :: a -> a -> a 2 type Sum a b :: * 3 3 (+++) :: a -> b -> Sum a b 4 4 5 instance Num Int where 5 instance MyNum Int Int where 6 (+++) x y = x + y 6 type Sum Int Int = Int 7 7 (+++) x y = x + y ⇒ Sum ist eine Funktion mit 2 Typen als Parameter und einem Typ als R¨ckgabewert u 35
  • 36. Einf¨hrung u Fazit Großraum GADTs Verwandtes: Associated Types Beispiele f¨r GADTs u Verwandtes: Dependent Types Schlußbetrachtungen Associated Types (2) Zur Erinnerung: 1 class MyNum a b where 2 type Sum a b :: * 3 (+++) :: a -> b -> Sum a b MyNum Float Int: 1 instance Integral a => MyNum Float a where 2 type Sum Float a = Float 3 (+++) x y = x + intToFloat y ⇒ Floats und Ints addieren! ≈ Ints und Floats? 36
  • 37. Einf¨hrung u Fazit Großraum GADTs Verwandtes: Associated Types Beispiele f¨r GADTs u Verwandtes: Dependent Types Schlußbetrachtungen Associated Types (3) Zur Erinnerung: 1 class MyNum a b where 2 type Sum a b :: * 3 (+++) :: a -> b -> Sum a b MyNum Int Float: 1 instance Integral a => MyNum a Float where 2 type Sum a Float = Float 3 (+++) x y = y +++ x ⇒ nun ist +++ kommutativ! 37
  • 38. Einf¨hrung u Fazit Großraum GADTs Verwandtes: Associated Types Beispiele f¨r GADTs u Verwandtes: Dependent Types Schlußbetrachtungen Dependent Types (1) ⇒ Typen, die von Werten abh¨ngen a ⇒ Agda 38
  • 39. Einf¨hrung u Fazit Großraum GADTs Verwandtes: Associated Types Beispiele f¨r GADTs u Verwandtes: Dependent Types Schlußbetrachtungen Dependent Types (2) Willk¨rliches Beispiel: u q : ΣN (λx → if x = 1 then N else Bool) Werte f¨r q: u q = 4, true q = 1, 42 39
  • 40. Einf¨hrung u Fazit Großraum GADTs Verwandtes: Associated Types Beispiele f¨r GADTs u Verwandtes: Dependent Types Schlußbetrachtungen Dependent Types (3) ⇒ noch genauere Typ¨berp¨fungen / Invarianten u u z.B.: Vektoren (auch mit GADTs) Matrizen (m × n → n × o → m × o) Bin¨re B¨ume (links < mitte < rechts) a a ≈ Vermischung Typ/Wert ≈ Endlosschleifen im Typsystem ≈ Typgleichheit 40