Typen und Klassen

Werbung
Typen und Klassen
Hubert Wagner
18. Januar 2008
Hubert Wagner ()
Typen und Klassen
18. Januar 2008
1 / 16
Datentypen
Basis-Datentypen wie z.B.
Hubert Wagner ()
Typen und Klassen
18. Januar 2008
2 / 16
Datentypen
Basis-Datentypen wie z.B.
Int
Hubert Wagner ()
Typen und Klassen
18. Januar 2008
2 / 16
Datentypen
Basis-Datentypen wie z.B.
Int
Bool
Hubert Wagner ()
Typen und Klassen
18. Januar 2008
2 / 16
Datentypen
Basis-Datentypen wie z.B.
Int
Bool
Datentypen mittels Konstruktionen:
Hubert Wagner ()
Typen und Klassen
18. Januar 2008
2 / 16
Datentypen
Basis-Datentypen wie z.B.
Int
Bool
Datentypen mittels Konstruktionen:
[Float]
Hubert Wagner ()
Typen und Klassen
18. Januar 2008
2 / 16
Datentypen
Basis-Datentypen wie z.B.
Int
Bool
Datentypen mittels Konstruktionen:
[Float]
(Int, Bool)
Hubert Wagner ()
Typen und Klassen
18. Januar 2008
2 / 16
Datentypen
Basis-Datentypen wie z.B.
Int
Bool
Datentypen mittels Konstruktionen:
[Float]
(Int, Bool)
Int -> (Int -> Int)
Hubert Wagner ()
Typen und Klassen
18. Januar 2008
2 / 16
Datentypen
Basis-Datentypen wie z.B.
Int
Bool
Datentypen mittels Konstruktionen:
[Float]
(Int, Bool)
Int -> (Int -> Int)
Typsynonyme
Hubert Wagner ()
Typen und Klassen
18. Januar 2008
2 / 16
Datentypen
Basis-Datentypen wie z.B.
Int
Bool
Datentypen mittels Konstruktionen:
[Float]
(Int, Bool)
Int -> (Int -> Int)
Typsynonyme
type Point = (Float, Float)
Hubert Wagner ()
Typen und Klassen
18. Januar 2008
2 / 16
Datentypen
Basis-Datentypen wie z.B.
Int
Bool
Datentypen mittels Konstruktionen:
[Float]
(Int, Bool)
Int -> (Int -> Int)
Typsynonyme
type Point = (Float, Float)
type Parser a = String -> [(a, String)]
Hubert Wagner ()
Typen und Klassen
18. Januar 2008
2 / 16
Datentypen
Basis-Datentypen wie z.B.
Int
Bool
Datentypen mittels Konstruktionen:
[Float]
(Int, Bool)
Int -> (Int -> Int)
Typsynonyme
type Point = (Float, Float)
type Parser a = String -> [(a, String)]
benutzerde…nierte Datentypen
Hubert Wagner ()
Typen und Klassen
18. Januar 2008
2 / 16
Datentypen
Basis-Datentypen wie z.B.
Int
Bool
Datentypen mittels Konstruktionen:
[Float]
(Int, Bool)
Int -> (Int -> Int)
Typsynonyme
type Point = (Float, Float)
type Parser a = String -> [(a, String)]
benutzerde…nierte Datentypen
data Tage = Montag j Dienstag j Mittwoch j Donnerstag
Hubert Wagner ()
Typen und Klassen
18. Januar 2008
2 / 16
Datentypen
Basis-Datentypen wie z.B.
Int
Bool
Datentypen mittels Konstruktionen:
[Float]
(Int, Bool)
Int -> (Int -> Int)
Typsynonyme
type Point = (Float, Float)
type Parser a = String -> [(a, String)]
benutzerde…nierte Datentypen
data Tage = Montag j Dienstag j Mittwoch j Donnerstag
data Tree a = Node a [Tree a]
Hubert Wagner ()
Typen und Klassen
18. Januar 2008
2 / 16
(Typ-) Klassen
Menge von Typen
Hubert Wagner ()
Typen und Klassen
18. Januar 2008
3 / 16
(Typ-) Klassen
Menge von Typen
Signatur, d.h. Liste von Operatoren mit zugehöriger Typangabe
Hubert Wagner ()
Typen und Klassen
18. Januar 2008
3 / 16
(Typ-) Klassen
Menge von Typen
Signatur, d.h. Liste von Operatoren mit zugehöriger Typangabe
jeder Typ in der Typklasse beinhaltet die Operatoren
Reihe von Typklassen in der Standardbibliothek de…niert
Hubert Wagner ()
Typen und Klassen
18. Januar 2008
3 / 16
Beispiele de…nierter Typklassen
class Eq a where
(==), (/=)
x /= y
Hubert Wagner ()
::
=
a -> a -> Bool
not (x == y)
Typen und Klassen
18. Januar 2008
4 / 16
Beispiele de…nierter Typklassen
class Eq a where
(==), (/=) :: a -> a -> Bool
x /= y
= not (x == y)
Jeder Typ in dieser Typklasse besitzt diese beiden Funktionen
Hubert Wagner ()
Typen und Klassen
18. Januar 2008
4 / 16
Beispiele de…nierter Typklassen
class Eq a where
(==), (/=) :: a -> a -> Bool
x /= y
= not (x == y)
Jeder Typ in dieser Typklasse besitzt diese beiden Funktionen
Basistypen sind Elemente dieser Typklasse
Hubert Wagner ()
Typen und Klassen
18. Januar 2008
4 / 16
Beispiele de…nierter Typklassen
class Eq a where
(==), (/=) :: a -> a -> Bool
x /= y
= not (x == y)
Jeder Typ in dieser Typklasse besitzt diese beiden Funktionen
Basistypen sind Elemente dieser Typklasse
Zugehörigkeit eines Typs T zu einer Typklasse C wird ausgedrückt
durch
instance C T where . . .
wobei in . . . die Operatoren von C für den Typ T zu konkretisieren
sind
Hubert Wagner ()
Typen und Klassen
18. Januar 2008
4 / 16
Beispiele de…nierter Typklassen
class Eq a where
(==), (/=) :: a -> a -> Bool
x /= y
= not (x == y)
Jeder Typ in dieser Typklasse besitzt diese beiden Funktionen
Basistypen sind Elemente dieser Typklasse
Zugehörigkeit eines Typs T zu einer Typklasse C wird ausgedrückt
durch
instance C T where . . .
wobei in . . . die Operatoren von C für den Typ T zu konkretisieren
sind
Example
instance Eq
False
True
_
Bool where
== False
== True
==
_
Hubert Wagner ()
= True
= True
= False
Typen und Klassen
18. Januar 2008
4 / 16
Abgeleitete Typklassen
Typklasse kann durch Hinzunahme neuer Operatoren zu neuer
Typklasse abgeleitet werden
(die hierdurch festgelegte Menge von Typen ist eine Teilmenge der
Ausgangsmenge)
Hubert Wagner ()
Typen und Klassen
18. Januar 2008
5 / 16
Abgeleitete Typklassen
Typklasse kann durch Hinzunahme neuer Operatoren zu neuer
Typklasse abgeleitet werden
(die hierdurch festgelegte Menge von Typen ist eine Teilmenge der
Ausgangsmenge)
Ableitung einer Typklasse F aus Typklasse T wird ausgedrückt durch
class T => F where . . .
wobei in . . . die hinzugekommenen Operatoren de…niert werden
Hubert Wagner ()
Typen und Klassen
18. Januar 2008
5 / 16
Example
Die Klasse Ord a von Typen, deren Elemente vollständig geordnet sind,
wird de…niert als Ableitung aus der Typklasse Eq a durch
class Eq a => Ord a where
(<), (<=), (>), (>=)
min, max
min x y j x <= y
j otherwise
max x y j x <= y
j otherwise
Hubert Wagner ()
::
::
=
=
=
=
a -> a -> Bool
a -> a -> a
x
y
y
x
Typen und Klassen
18. Januar 2008
6 / 16
Weitere de…nierte Typklassen
Aufzählungstypklasse: Enum
Example
class Ord a => Enum a where
toEnum
:: Int -> a
fromEnum
:: a -> Int
enumFrom
:: a -> [a]
enumFromThen
:: a -> a -> [a]
enumFromTo
:: a -> a -> [a]
enumFromThenTo :: a -> a -> a -> [a]
Hubert Wagner ()
Typen und Klassen
-
-
[n ..]
[n,m ..]
[n .. m]
[n,k .. m]
18. Januar 2008
7 / 16
Weitere de…nierte Typklassen
Show a
Hubert Wagner ()
Typen und Klassen
18. Januar 2008
8 / 16
Weitere de…nierte Typklassen
Show a
Read a
Hubert Wagner ()
Typen und Klassen
18. Januar 2008
8 / 16
Weitere de…nierte Typklassen
Show a
Read a
Num a, wobei
Hubert Wagner ()
Typen und Klassen
18. Januar 2008
8 / 16
Weitere de…nierte Typklassen
Show a
Read a
Num a, wobei
De…nition
class (Eq a, Show a) => Num a
(+), (-), (?) ::
negate
::
abs, signum ::
fromInteger ::
fromInt
::
x-y
=
fromInt
=
Hubert Wagner ()
where
a -> a -> a
a -> a
a -> a
Integer -> a
Int -> a
x + negate y
fromIntegral
Typen und Klassen
18. Januar 2008
8 / 16
Example
Typklasse Stack s mit polymorphen Datentypen s, auf denen die üblichen
Stack-Operationen de…niert sind:
De…nition
class Stack s where
push
top
pop
isEmptyStack
showStack
showStack st
Hubert Wagner ()
::
::
::
::
::
=
a -> s a -> s a
s a -> a
s a -> s a
s a -> Bool
(Show a) => s a -> String
if isEmptyStack st then ”!”
else (show (top st))++ ”-” ++(showStack (pop st))
Typen und Klassen
18. Januar 2008
9 / 16
Stack-Implementierung durch Terme
Example
data TermStack a = EmptyStack j Push a (TermStack a)
Einordnung in die Typklasse Stack:
instance Stack TermStack where
push
isEmptyStack (EmptyStack)
isEmptyStack (Push _ _)
pop (EmptyStack)
pop (Push _ s)
top (EmptyStack)
top (Push e _)
=
=
=
=
=
=
=
Push
True
False
error ”pop on empty stack”
s
error ”top on empty stack”
e
Instanz-Deklaration muss mindestens die Methoden de…nieren, für die
keine Default-De…nition vorliegt
Hubert Wagner ()
Typen und Klassen
18. Januar 2008
10 / 16
Typklasse Monade
von Bedeutung für Programme mit Seitene¤ekten (z.B.
IO-Operationen)
Example
In einem Programm sei ein Ausdruck der Form auszuführen:
inputInt - inputInt
wobei mit inputInt ein Integer-Wert von der Tastatur eingegeben wird.
Was wäre das Resultat, wenn 12 und 8 eingegeben werden?
Resultat abhängig von der Reihenfolge der Auswertung (u.U. von
Betriebssystem oder Hardware abhängig)
Lösung in Haskell mit Monaden-Konzept:
Explizit festgelegte Verarbeitungsfolge wird mittels der
Monadenoperatoren erreicht
Hubert Wagner ()
Typen und Klassen
18. Januar 2008
11 / 16
Typklasse Monade
De…nition
class Monad m where
(>>=)
return
(>>)
fail
m >> k
fail s
::
::
::
::
=
=
Hubert Wagner ()
m a -> (a -> m b) -> m b
a -> m a
m a -> m b -> m b
String -> m a
m >>= n_ -> k
error s
Typen und Klassen
Bind-Operator
Sequentialisierungsoperator
18. Januar 2008
12 / 16
Wirkungsweise des Bind-Operators
Example
Der Bind-Operator arbeitet wie folgt:
In
w >>= f
mit w vom Typ m a und f vom Typ m a ->
m b wird der in w durch die Monade gekapselte Wert x vom Typ a als
Argument an die Funktion „gebunden”, f liefert für x dann einen durch die
Monade gekapselten Wert vom Typ b als Ergebnis, dieser ist dann das
Ergebnis.
Der Bind-Operator in do-Notation:
do x <- w
f x
Example
test :: IO ()
test = do x <- readInt
print (x+5)
Hubert Wagner ()
Typen und Klassen
18. Januar 2008
13 / 16
Beispiele für Monaden
Example
Die Monade Identität:
data Id a = Id a
instance Monad Id where
(Id x) >>= f =
return x
=
fx
Id x
Um Elemente anzeigen zu können:
instance Show a => Show (Id a) where
show (Id x) = "Wert: "++ show x
Hubert Wagner ()
Typen und Klassen
18. Januar 2008
14 / 16
Beispiele für Monaden
Example
instance Monad Parser where
(>>=)
:: Parser a -> (a -> Parser b) -> Parser b
p >>= f = ninp -> case parse p inp of
[ ] _> [ ]
[(v,out)] _> parse (f v) out
return
:: a -> Parser
return x
= ninp -> [(x, inp)]
parse wie im Kapitel für Parser de…niert
Hubert Wagner ()
Typen und Klassen
18. Januar 2008
15 / 16
Beispiele für Monaden
Example
Ausdrücke vom Typ IO a sind Aktionen.
type IO a = World -> (a,World)
Typ World repräsentiert Zustand des Systems
instance Monad IO where
(>>=)
:: IO a -> (a -> IO b) -> IO b
p >>= f = nworld -> case p world of
(v, world’) -> f v world’
return
:: a -> IO a
return x
= nworld -> (x,world)
return und >>= wie im Kapitel für IO de…niert
Hubert Wagner ()
Typen und Klassen
18. Januar 2008
16 / 16
Herunterladen