Vorlesung: Praxis der Funktionalen Programmierung
Kombinatoren
In Funktionalen Sprachen können wir mit Funktionen rechnen (daher der Name).
Wir haben bis jetzt Funktionen auf Argumente angewandt
(was anderes können wir gar nicht, die Sprache ist ja rein applikativ).
Seit wir "map" kennen, wissen wir, daß wir als Argument einer Funktion
auch eine Funktion geben können,
und seit partiell angewandten Funktionen verstehen wir,
daß auch Ergebnisse einer Funktion selbst wieder Funktionen sein können.
Außer map gibt es nun noch eine ganze Reihe von Funktionen höherer Ordnung,
einige vordefiniert in der Prelude, andere bauen wir selbst.
Komposition
Der Ausdruck "f . g" beschreibt die Funktion h mit h x = f (g x), also
(.) :: (b -> c) -> (a -> b) -> (a -> c)
f . g = \ x -> f (g x)
Beispiel
(reverse . reverse) [1,2,3] = [1,2,3]
Argumente vertauschen
flip :: (a -> b -> c) -> (b -> a -> c)
flip f = \ x y -> f y x
Beispiel
( flip (++) ) [1 .. 3] [4 .. 7] = [4,5,6,7,1,2,3]
Mehrfach anwenden
drei :: (a -> a) -> (a -> a)
drei f = \ x -> f (f (f x))
Beispiel (beachte die Operator Section)
drei (+ 1) 0 = 3
Hausaufgabe: erkläre die Auswertung von
( drei drei ) (+1) 0
( drei . drei ) (+1) 0
Weitere
wichtige Kombinatoren sind
const :: a -> b -> a
const x = \ y -> x
id :: a -> a
id = \ x -> x
http://www.informatik.uni-leipzig.de/~joe/
mailto:joe@informatik.uni-leipzig.de