First Class functions
Funktionale Programmiersprachen zeichnen sich unter anderem durch First Class Functions aus. Was heißt das? Funktionen sind Daten sehr ähnlich: Sie können zur Laufzeit erzeugt, in Datenstrukturen gespeichert, als Argumente oder Rückgabewerte von Funktionen verwendet werden. Klassischerweise dienen gerne Dictionaries zum Speichern von Funktionen. Der Dispatch Table der arithmetischen Grundfunktionen aus Abbildung 1 speichert anonyme Funktionen (Lambda-Funktionen), die auf Anfrage die Ergebnisse liefern. Die Rechenmaschine lässt sich zur Laufzeit um eine neue Rechenoperation erweitern.
Abbildung 1: Funktionale Programmiersprachen zeichnen sich unter anderem durch First Class Functions aus.
Mit den Funktionsobjekt-Wrappern wie "function<double(double,double)>" der kommenden C++-Bibliothekserweiterung und der Lambda-Bibliothek von Boost, ist der Dispatch Table rasch in C++ implementiert. Der künftige C++-Standard C++0x wird Lambda-Ausdrücke als direkte Erweiterung der Kernsprache besitzen.
| Listing 1: Dispatch Table in C++ |
|---|
std::map< const char , function<double(double,double)> > dispTable;
dispTable.insert( std::make_pair('+', _1 + _2));
dispTable.insert( std::make_pair('-', _1 - _2));
dispTable.insert( std::make_pair('*', _1 * _2));
dispTable.insert( std::make_pair('/', _1 / _2))
|
Durch die Platzhalterausdrücke "_1" und "_2" wird in C++ ein Lambda-Ausdruck definiert. Zusätzlich muß die Map der Standard Template Library mit dem Typ des Schlüssels und des Wertes, dem Funktionsobjekt, bekannt gemacht werden.
Funktionen höherer Ordnung
Funktionen höherer Ordnung sind Funktionen, welche Funktionen entweder als Argumente annehmen oder als Rückgabewert zurückgeben. Die klassischen Beispiele sind die Funktionen "map", "filter" und die Funktionenfamilie "fold*", da sie typische Anwendungsfälle für die Listenverarbeitung abstrahieren:
- wende eine Funktion sukzessive auf die Elemente einer Liste an
- filtere Elemente aus einer Liste heraus
- reduziere eine Liste auf einen Ausgabewert, indem die Listepaare akkumuliert werden.
Ein paar Beispiele (Abbildung 2) aus Haskell sollen dies verdeutlichen.
Der Ausdruck "(\x -> x*x)" ist die Lambda-Funktion in Haskell, die ein x auf dessen Quadrat abbildet. Die anonyme Funktion kann direkt als Argument der "map"-Funktion verwendet werden. Noch ein paar Worte über die Funktionenfamilie "fold*": Sie ist die mächtigste der drei Funktionen, da durch sie sowohl "map" als auch "reduce" implementiert werden kann. Darüber hinaus existieren Variationen, die die Liste von rechts oder von links, mit und ohne Initialwert reduzieren.
Alle drei Funktionen sind elementare Bausteinchen der funktionalen Programmierung und finden sich in den anderen funktionalen Programmiersprachen wieder. Die imperativen Programmiersprachen Python und C++ bieten sie auch an.
| Gegenüberstellung der Haskell-Funktionen map, filter und fold* |
||
|---|---|---|
| Haskell |
Python |
C++ |
| map |
map |
std::transform |
| filter |
filter |
std::remove_copy_if |
| fold* |
reduce |
std::accumulate |
Diesen Artikel als PDF kaufen
Als digitales Abo
Weitere Produkte im Medialinx Shop »
Versandartikel
Onlineartikel
Alle Rezensionen aus dem Linux-Magazin
- Buecher/07 Bücher über 3-D-Programmierung sowie die Sprache Dart
- Buecher/06 Bücher über Map-Reduce und über die Sprache Erlang
- Buecher/05 Bücher über Scala und über Suchmaschinen-Optimierung
- Buecher/04 Bücher über Metasploit sowie über Erlang/OTP
- Buecher/03 Bücher über die LPI-Level-2-Zertifizierung
- Buecher/02 Bücher über Node.js und über nebenläufige Programmierung
- Buecher/01 Bücher über Linux-HA sowie über PHP-Webprogrammierung
- Buecher/12 Bücher über HTML-5-Apps sowie Computer Vision mit Python
- Buecher/11 Bücher über Statistik sowie über C++-Metaprogrammierung
- Buecher/10 Bücher zu PHP-Webbots sowie zur Emacs-Programmierung
Insecurity Bulletin
Im Insecurity Bulletin widmet sich Mark Vogelsberger aktuellen Sicherheitslücken sowie Hintergründen und Security-Grundlagen. mehr...





