Haskell

Haskell ist eine rein funktionale Programmiersprache, d.h. man schreibt ein Programm in dem man Funktionen definiert, die zu gegebenen Eingangswerten stets das selbe Ergebnis liefern, ohne dass die Berechnung hierbei Nebenwirkungen aufweisen darf. Es ist also egal, ob eine Funktion keinmal, einmal oder mehrfach "aufgerufen" (bzw. ausgewertet) wird, da der einzige Weg mit der Außenwelt zu kommunizieren der (bei gleichen Eingangsparametern stets identische) Ausgangswert ist.

Wenn Funktionen keine Nebenwirkungen haben dürfen, stellt sich die Frage, wie man unter diesen Bedingungen ein interaktives Programm schreiben kann, da z.B. eine Funktion getLine bei gleichen Eingangsparametern nicht immer den gleichen Rückgabewert haben darf, oder es bei einer Funktion putStrLn durchaus darauf ankommt, ob die Aktion einmal oder mehrfach durchgeführt werden soll.

Um dieses Problem zu lösen wird das mathematische Konzept von Monaden verwendet. Anstelle, dass eine Funktion getLine direkt die vom Benuter eingegebene Zeile zurück gibt, ist das Ergebnis der Funktion ein Wert der die IO-Operation unter Rückgabe eines Wertes eines bestimmten Types darstellt. Die Werte, welche IO-Operationen darstellen lassen sich mit Hilfe des >>= Operators verketten. Auf der linken Seite dieses Operators steht eine IO-Operation, während auf der rechten Seite des Operators eine Funktion zu stehen hat, die das Ergebnis der linken IO-Operation erhält, und wiederum eine neue IO-Operation zurückgibt:

getLine >>= (\line -> putStrLn line)

oder

getLine >>= putStrLn

Haskell bietet eine Syntax um solche Operationen ähnlich wie in einer imperativen Sprache aufzuschreiben:

main = do
  line <- getLine
  putStrLn line

Trotz der imperativ-erscheinenden Syntax ist dies eine rein funktionale Darstellung eines Programmes, welches eine Zeile ließt, und diese wieder ausgibt.

Um die mögliche Eleganz von Haskell-Programmen zu demonstrieren, soll folgendes Beispiel dienen:

natural_numbers  =  integers_from 1
  where  integers_from n  =  n : integers_from (n+1)

squared_numbers  =  [ n^2 | n <- natural_numbers ]

main = do
  putStrLn (show (take 10 squared_numbers))

Das Programm erzeugt folgende Ausgabe: [1,4,9,16,25,36,49,64,81,100]

Obwohl natural_numbers und squared_numbers eine unendliche Liste von Zahlen darstellen, benötigt das Programm keinesfalles unendlich viel Zeit um zu einem Ergebnis zu kommen, da der Kompiler die Auswertung von bestimmten (unbenötigten) Ausdrücken nicht durchzuführen braucht, da das Auswerten von Funktionsergebnissen keine Nebenwirkungen haben darf.

Viele Informationen und Downloads finden sich auf der Webseite http://www.haskell.org/


Zurück zur Hauptseite

Impressum