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 2010, 25. April 2010, 2010 D.Rösner D. Rösner FP 2010 . . . 1 Einleitung Tree List Gesetze 1 Einleitung 2 Tree 3 List 4 Gesetze D. Rösner FP 2010 . . . 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 2010 . . . 3 D. Rösner FP 2010 . . . 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 D. Rösner FP 2010 . . . D. Rösner FP 2010 . . . 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 Typ Tree als eine Instanz der (abstrakteren) Klasse Functor: fmap :: (a -> b) -> f a -> f b instance Functor Tree where fmap f (Leaf x) = Leaf (f x) fmap f (Branch t1 t2) = Branch (fmap f t1)(fmap f t2) 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 D. Rösner FP 2010 . . . 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 b) 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 2010 . . . 9 D. Rösner FP 2010 . . . 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 2010 . . . 10 damit Abstraktion generischer Container-Typen 11 D. Rösner FP 2010 . . . 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 2010 . . . 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. D. Rösner FP 2010 . . . 15 D. Rösner FP 2010 . . . 14