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 2010, 25. April 2010, 2010 D.Rösner D. Rösner FP 2010 . . . 1 Einleitung Tree List Gesetze Gliederung 1 Einleitung 2 Tree 3 List 4 Gesetze D. Rösner FP 2010 . . . 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 2010 . . . 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 2010 . . . 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 2010 . . . 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 D. Rösner FP 2010 . . . 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 2010 . . . 7 Einleitung Tree List Gesetze Klasse Functor Typ Tree als eine 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 2010 . . . 8 Einleitung Tree List Gesetze Zum Vergleich: direkte Definition des Typs Tree : data Tree a = Leaf a | Branch (Tree a) (Tree b) 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 2010 . . . 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 2010 . . . 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 2010 . . . 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 2010 . . . 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 2010 . . . 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 2010 . . . 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. D. Rösner FP 2010 . . . 15