Funktionale Programmierung - Haskell: Klasse Functor - Otto

Werbung
Einleitung
Tree
List
Gesetze
Einleitung
Tree
List
Gesetze
Gliederung
Funktionale Programmierung
Haskell: Klasse Functor
D. Rösner
Institut für Wissens- und Sprachverarbeitung
Fakultät für Informatik
Otto-von-Guericke Universität Magdeburg
c
Sommer 2014, 2. Mai 2014, 2011-14
D.Rösner
D. Rösner FP 2014 . . .
1
Einleitung
Tree
List
Gesetze
1
Einleitung
2
Tree
3
List
4
Gesetze
D. Rösner FP 2014 . . .
2
Einleitung
Tree
List
Gesetze
Haskell: Typen höherer Ordnung
Haskell: Typkonstruktoren
bisher: Typen erster Ordnung
Tree ist kein Typ, sondern ein Typkonstruktor
z.B. Tree Int Bäume mit Werten vom Typ Int
Ein Typkonstruktor nimmt einen Typ als Argument und
gibt einen Typ als Ergebnis zurück.
oder Tree a Bäume mit Werten vom Typ a
Typkonstruktoren kann man – in Analogie zu Funktionen
höherer Ordnung – als ‘Typen höherer Ordnung´
bezeichnen.
Was ist mit Tree?
s.a. [Hud00]
D. Rösner FP 2014 . . .
3
D. Rösner FP 2014 . . .
4
Einleitung
Tree
List
Gesetze
Einleitung
Tree
List
Gesetze
Haskell: Typkonstruktoren
Klasse Functor
class Functor f where
fmap :: (a -> b) -> f a -> f b
Typvariable unterschiedlich verwendet
in Haskell nicht direkt als Werte verwendbar
aber: sinnvoll in Deklarationen von Klassen
Beispiel: aus dem Standard Prelude
Typvariablen a und b bezeichnen in (a -> b) den Typ des
Urbild- bzw. des Bildbereichs einer Funktion
in f a und f b wird die Typvariable f aber auf andere
Typen angewendet
m.a.W. f muss also von einem Typ wie Tree sein, also ein
Typkonstruktor, der auf ein Argument angewendet werden
kann
Klasse Functor:
class Functor f where
fmap :: (a -> b) -> f a -> f b
u.a. [Hud00], [OGS09]
D. Rösner FP 2014 . . .
D. Rösner FP 2014 . . .
5
Einleitung
Tree
List
Gesetze
6
Einleitung
Tree
List
Gesetze
Klasse Functor
Klasse Functor
Funktion fmap (kurz für functormap) aus der Signatur von
Functor
Deklaration des Typs Tree als Instanz der (abstrakteren)
Klasse Functor:
fmap :: (a -> b) -> f a -> f b
instance Functor Tree where
Bedeutung:
fmap f (Leaf x)
Anwenden einer Funktion auf alle Datenelemente des
jeweiligen Instanztyps (abstrakt: eines Containers) und
= Leaf (f x)
fmap f (Branch t1 t2)
= Branch (fmap f t1)(fmap f t2)
Erzeugen eines gleichgestaltigen Containers mit den
Ergebnissen der elementweisen Funktionsanwendungen
D. Rösner FP 2014 . . .
7
D. Rösner FP 2014 . . .
8
Einleitung
Tree
List
Gesetze
Einleitung
Tree
List
Gesetze
Zum Vergleich:
Klasse Functor
direkte Definition des Typs Tree :
auch für Listentypen [a] gibt es einen Typkonstruktor
data Tree a = Leaf a | Branch (Tree a) (Tree a)
Schreibweise: []
damit: Instanz von Functor für Listen:
mapTree :: (a -> b) -> Tree a -> Tree b
mapTree f (Leaf x)
= Leaf (f x)
mapTree f (Branch t1 t2)
= Branch (mapTree f t1)(mapTree f t2)
instance Functor [] where
fmap f []
= []
fmap f (x:xs) = f x:fmap f xs
damit Instanzdeklaration auch schreibbar als:
beachte: [] wird hier einmal als Typkonstruktor und sonst
als Wert im Datentyp Liste verwendet
instance Functor Tree where
fmap = mapTree
D. Rösner FP 2014 . . .
9
D. Rösner FP 2014 . . .
Einleitung
Tree
List
Gesetze
Einleitung
Tree
List
Gesetze
Instanz von Functor für Listen
Klasse Functor
verkürzte Schreibweise mit der Funktion map:
Vorteil: fmap einheitlich für alle Datentypen anwendbar, für
die Instanz von Functor definiert
instance Functor [] where
fmap = map
D. Rösner FP 2014 . . .
10
damit Abstraktion generischer Container-Typen
11
D. Rösner FP 2014 . . .
12
Einleitung
Tree
List
Gesetze
Einleitung
Tree
List
Gesetze
Klasse Functor
Klasse Functor
weitere Instanzen von Functor aus dem Prelude.hs:
Typkonstruktor Maybe
es wird erwartet (aber von Haskell nicht überprüft), dass
für Instanzen von Functor die folgenden Gesetze gelten:
instance Functor Maybe where
fmap f Nothing = Nothing
fmap f (Just x) = Just (f x)
fmap id = id
fmap (f.g) = fmap f.(fmap g)
Typkonstruktor IO
dabei: id ist die Identitätsfunktion:
id = \x -> x
instance Functor IO where
fmap f x = x >>= (return . f)
D. Rösner FP 2014 . . .
13
Einleitung
Tree
List
Gesetze
Literatur: I
Paul Hudak.
The Haskell School of Expression – Learning Functional
Programming through Multimedia.
Cambridge University Press, Cambridge, UK, 2000.
ISBN 0-521-64338-4.
Bryan O’Sullivan, John Goerzen, and Don Stewart.
Real World Haskell.
O’Reilly Media, Sebastopol, CA 95472, 2009.
ISBN 978-0-596-51498-3; online available at
http://book.realworldhaskell.org/.
D. Rösner FP 2014 . . .
15
D. Rösner FP 2014 . . .
14
Herunterladen