Funktionale Programmierung ist ein Programmierparadigma, bei dem Programme aus reinen Funktionen aufgebaut werden. Eine reine Funktion liefert für dieselben Eingaben immer dasselbe Ergebnis und verändert keinen Zustand außerhalb ihrer selbst. Das macht Code vorhersagbar, leicht testbar und nebenläufig sicher.

Die Grundidee

Im Zentrum stehen Funktionen als Werte: Sie lassen sich Variablen zuweisen, als Argumente übergeben und als Rückgabe erzeugen. Man spricht von Funktionen erster Klasse (First-Class Functions) und Funktionen höherer Ordnung (Higher-Order Functions). Typische Vertreter sind map, filter und reduce, die eine Operation auf ganze Listen anwenden, ohne eine Schleife von Hand zu schreiben.

Ein zweites Prinzip ist die Unveränderbarkeit (Immutability): Daten werden nach ihrer Erzeugung nicht mehr verändert. Statt ein vorhandenes Objekt zu modifizieren, erzeugt eine Funktion ein neues. Dadurch gibt es keine versteckten Seiteneffekte und keine Überraschungen durch geteilten, veränderlichen Zustand in parallelen Programmen.

Rekursion statt Schleifen

Da Schleifen oft Zustand verändern, nutzt die funktionale Programmierung bevorzugt Rekursion. Sprachen wie Haskell unterstützen Endrekursion, damit tiefe rekursive Aufrufe genauso effizient sind wie Schleifen.

Sprachen und Verbreitung

Rein funktionale Sprachen sind Haskell und Elixir/Erlang. Auch F# und Scala unterstützen das Paradigma stark, und moderne Züge wie Lambda-Ausdrücke und map/filter finden sich in Python und JavaScript. Die mathematische Grundlage liefert der Lambda-Kalkül, die deklarative Einordnung der Deklarative Programmierung.

Abgrenzung zur Objektorientierung

Während die Objektorientierung Daten und Verhalten in Objekten mit veränderlichem Zustand kapselt, trennt die funktionale Programmierung Daten und Funktionen und setzt auf unveränderliche Werte. Beide Stile lassen sich in modernen Sprachen kombinieren; viele Teams schreiben ihren Kern in funktionalem Stil und kapseln Seiteneffekte bewusst an den Rändern.

Praxis-Tipps

  • Funktionen klein halten: eine Funktion, eine Aufgabe — das erleichtert das Testen und Wiederverwenden.
  • Seiteneffekte (Datei-, Netzwerk-, Datenbankzugriffe) an die Grenzen des Programms verlagern.
  • Unveränderliche Datenstrukturen bevorzugen; bestehende Strukturen beim Ändern kopieren statt mutieren.

Verwandte Grundlagen: Entwurfsmuster, Kompilieren und UML.