— user@ocaml-programming —
user@ocaml-programming $ cat ./ocaml-programming.md (main)

ocaml-programming

# OCaml für die Praxis — eine Tutorial-Reihe.

~/ / docs / Grundlagen / 03 · Grundlagen

Pattern Matching — die zentrale Idee

match-Ausdrücke, Vollständigkeitsprüfung des Compilers und warum Pattern Matching in OCaml mehr als ein switch ist.

Pattern Matching ist in OCaml kein Komfort-Feature, sondern das Werkzeug, mit dem man Datenstrukturen zerlegt, Kontrollfluss steuert und Fehler explizit macht. Wer es verstanden hat, schreibt deutlich klareren Code.

match-Ausdrücke

Ein match prüft einen Wert gegen mehrere Muster und liefert den Wert des passenden Zweigs zurück. Beispielsweise eine Funktion auf einer Liste:

let describe lst =
  match lst with
  | [] -> "leer"
  | [x] -> "ein Element"
  | [x; y] -> "zwei Elemente"
  | _ :: _ -> "mehr als zwei"

Der Doppelpunkt :: ist der Cons-Operator und konstruiert oder dekonstruiert Listen. _ ist ein Wildcard-Muster, das alles akzeptiert, ohne den Wert zu binden.

Das eigentlich Besondere: Der Compiler prüft Vollständigkeit. Lässt man einen Fall weg, kommt eine Warnung mit konkretem Gegenbeispiel:

$ ocaml describe.ml
Warning 8: this pattern-matching is not exhaustive.
Here is an example of a case that is not matched:
[]

Diese Warnungen sollte man als Fehler behandeln — sie zeigen reale Lücken im Programm.

Muster sind ausdrucksstark

Innerhalb von Mustern lassen sich Werte binden, Konstanten prüfen und Strukturen verschachteln. Das nächste Beispiel zerlegt ein Tupel:

let coord_quadrant (x, y) =
  match (x > 0, y > 0) with
  | (true,  true)  -> "I"
  | (false, true)  -> "II"
  | (false, false) -> "III"
  | (true,  false) -> "IV"

Hier wird das Tupel-Pattern (x, y) schon in der Argumentliste benutzt — eine Kurzform, die für let coord_quadrant pair = match pair with (x, y) -> ... steht.

Guards verfeinern

Mit when lassen sich Muster um Bedingungen ergänzen — sogenannte Guards. Sie sind nützlich, wenn ein reines Pattern den Fall nicht trennen kann:

let sign n =
  match n with
  | 0          -> "null"
  | n when n > 0 -> "positiv"
  | _          -> "negativ"

Guards schalten allerdings die Vollständigkeitsprüfung teilweise aus, weil der Compiler die Bedingung nicht statisch auswerten kann. Sparsam einsetzen.

Wann match nutzen?

Faustregel: Sobald ein Wert mehrere strukturelle Formen annehmen kann — Liste oder leer, Some oder None, Variante A, B oder C — gehört das in ein match. Der Code wird damit nicht nur kürzer, sondern auch sicherer, weil der Compiler unerledigte Fälle aufdeckt. Im nächsten Kapitel kommt mit Modulen und Signaturen der zweite tragende Pfeiler der Sprache.