Funktionale Programmierung - Haskell: Klasse Functor

Werbung
Einleitung
Tree
List
Gesetze
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
Gliederung
1
Einleitung
2
Tree
3
List
4
Gesetze
D. Rösner FP 2014 . . .
2
Einleitung
Tree
List
Gesetze
Haskell: Typen höherer Ordnung
bisher: Typen erster Ordnung
z.B. Tree Int Bäume mit Werten vom Typ Int
oder Tree a Bäume mit Werten vom Typ a
Was ist mit Tree?
s.a. [Hud00]
D. Rösner FP 2014 . . .
3
Einleitung
Tree
List
Gesetze
Haskell: Typkonstruktoren
Tree ist kein Typ, sondern ein Typkonstruktor
Ein Typkonstruktor nimmt einen Typ als Argument und
gibt einen Typ als Ergebnis zurück.
Typkonstruktoren kann man – in Analogie zu Funktionen
höherer Ordnung – als ‘Typen höherer Ordnung´
bezeichnen.
D. Rösner FP 2014 . . .
4
Einleitung
Tree
List
Gesetze
Haskell: Typkonstruktoren
in Haskell nicht direkt als Werte verwendbar
aber: sinnvoll in Deklarationen von Klassen
Beispiel: aus dem Standard Prelude
Klasse Functor:
class Functor f where
fmap :: (a -> b) -> f a -> f b
D. Rösner FP 2014 . . .
5
Einleitung
Tree
List
Gesetze
Klasse Functor
class Functor f where
fmap :: (a -> b) -> f a -> f b
Typvariable unterschiedlich verwendet
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
u.a. [Hud00], [OGS09]
D. Rösner FP 2014 . . .
6
Einleitung
Tree
List
Gesetze
Klasse Functor
Funktion fmap (kurz für functormap) aus der Signatur von
Functor
fmap :: (a -> b) -> f a -> f b
Bedeutung:
Anwenden einer Funktion auf alle Datenelemente des
jeweiligen Instanztyps (abstrakt: eines Containers) und
Erzeugen eines gleichgestaltigen Containers mit den
Ergebnissen der elementweisen Funktionsanwendungen
D. Rösner FP 2014 . . .
7
Einleitung
Tree
List
Gesetze
Klasse Functor
Deklaration des Typs Tree als Instanz der (abstrakteren)
Klasse Functor:
instance Functor Tree where
fmap f (Leaf x)
= Leaf (f x)
fmap f (Branch t1 t2)
= Branch (fmap f t1)(fmap f t2)
D. Rösner FP 2014 . . .
8
Einleitung
Tree
List
Gesetze
Zum Vergleich:
direkte Definition des Typs Tree :
data Tree a = Leaf a | Branch (Tree a) (Tree a)
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)
damit Instanzdeklaration auch schreibbar als:
instance Functor Tree where
fmap = mapTree
D. Rösner FP 2014 . . .
9
Einleitung
Tree
List
Gesetze
Klasse Functor
auch für Listentypen [a] gibt es einen Typkonstruktor
Schreibweise: []
damit: Instanz von Functor für Listen:
instance Functor [] where
fmap f []
= []
fmap f (x:xs) = f x:fmap f xs
beachte: [] wird hier einmal als Typkonstruktor und sonst
als Wert im Datentyp Liste verwendet
D. Rösner FP 2014 . . .
10
Einleitung
Tree
List
Gesetze
Instanz von Functor für Listen
verkürzte Schreibweise mit der Funktion map:
instance Functor [] where
fmap = map
D. Rösner FP 2014 . . .
11
Einleitung
Tree
List
Gesetze
Klasse Functor
Vorteil: fmap einheitlich für alle Datentypen anwendbar, für
die Instanz von Functor definiert
damit Abstraktion generischer Container-Typen
D. Rösner FP 2014 . . .
12
Einleitung
Tree
List
Gesetze
Klasse Functor
es wird erwartet (aber von Haskell nicht überprüft), dass
für Instanzen von Functor die folgenden Gesetze gelten:
fmap id = id
fmap (f.g) = fmap f.(fmap g)
dabei: id ist die Identitätsfunktion:
id = \x -> x
D. Rösner FP 2014 . . .
13
Einleitung
Tree
List
Gesetze
Klasse Functor
weitere Instanzen von Functor aus dem Prelude.hs:
Typkonstruktor Maybe
instance Functor Maybe where
fmap f Nothing = Nothing
fmap f (Just x) = Just (f x)
Typkonstruktor IO
instance Functor IO where
fmap f x = x >>= (return . f)
D. Rösner FP 2014 . . .
14
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
Herunterladen