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

best viewed with any browser


http://www.informatik.uni-leipzig.de/~joe/ mailto:joe@informatik.uni-leipzig.de