Die zugrundeliegenden Denkansätze werden auch als Paradigmen bezeichnet. Hierbei gibt es vornehmlich folgende Unterscheidungen:
Entstehung | Name | Entwickler | Beschreibung |
1958/1960 | Lisp | John McCarthy | Listen als Grundstruktur Bedingte Ausdrücke als Programme und Daten Imperative (prozedurale) Anteile |
1978 | FP | John Backus | Polymorphes Typenkonzept Variablenfreie Ausdrücke Benutzerdefinierte Datenstrukturen Pattern Matching (Parameterabhängige Funktionsdefinitionenauswahl) |
1978 | ML | Robin Milner | Leistungsfähiges
Typkonzept Definition von abstrakten Datentypen |
1985 | Miranda | John Turner | Bedingt rekursive Gleichungen Benutzerdefinierte Funktionale Bedarfsgesteuerte Auswertungen (Lazy Evaluation) |
1989 | Haskell | Paul Hudak | Vollständige formale Semantik |
Problem | Haskell | Gofer | Objective Caml | Miranda |
Hallo Welt |
module HelloWorld (main) where
|
show "Hello World" |
print_string("Hello World\n");; |
"Hello World!"
|
Fakultät | fac 0 =
1 fac n = n * fac (n-1) |
fac :: Int -> Int fac 0 = 1 fac n = n * fac(n-1) |
letrec
fac n = if n > 1 then n * fac (n-1) else 1 ;; |
fac 0 = 1 fac 1 = 1 fac n = n * fac (n-1) |
Quicksort | quicksort [] = [] quicksort (s:xs) = quicksort [x|x <- xs,x < s] ++ [s] ++ quicksort [x|x <- xs,x >= s] |
qsort [] = [] qsort (a:x) = qsort [ b | b <- x; b<=a ] ++ [a] ++ qsort [ b | b <- x; b>a ] |
Ein weiteres gerne angeführtes Beispiel zur Verdeutlichung der
Ausdruckskraft funktionaler Sprachen ist der Quicksortalgorithmus.
Im Folgenden sind 2 Implementierungen des Algorithmus zu sehen. Eine
bezieht sich auf die funktionale Sprache Haskell und die andere auf die
prozedurale Sprache 'C'.
Quicksort in Haskell | Quicksort in C |
1. qsort
[] =
[] 2. qsort (x:xs) = qsort kleiner_x ++ [x] ++ qsort groessergleich_x where kleiner_x = [y | y <- xs, y < x] groessergleich_x = [y | y <- xs, y >= x] Implementierung: |
qsort( a, lo, hi ) int a[], hi,
lo; { int h, l, p, t; if (lo < hi) { l = lo; h = hi; p = a[hi]; do { t = a[l]; a[l] = a[hi]; a[hi] = t; |