zurück zur Liste

Begriffe in Haskell

Erklärungen

Lazy Evaluation: In "Haskell" werden Ausdrücke grundsätzlich nicht strikt ausgewertet. Ein (Teil-)Ausdruck wird erst durch seinen Wert ersetzt, wenn dieser zum Beispiel für einen arithmetischen Vergleich benötigt wird. Demzufolge wird auch ein als aktueller Parameter einer Funktion übergebener Ausdruck erst ausgewertet, wenn sein Wert innerhalb des Funktionsrumpfes verwendet wird. Wurde der Wert einmal berechnet, werden alle namentlichen Vorkommen des Ausdrucks durch seinen Wert ersetzt. Ein einfaches Beispiel verdeutlicht diese Strategie.

const1 a = 1

Definiert ist eine konstante Funktion "const1" mit einem beliebigen Parameter "a" und dem Rückgabewert 1. Der Rückgabewert folgender beispielhafter Funktionsaufrufe ist also immer 1.

(Pseudocode)
const1 10 => 1
const1 (1+4) => 1
const1 'A' => 1
const1 (1/0) => 1


Für das Ergebnis der Funktion ist der Wert des aktuellen Parameters irrelevant. Er wird von einem Interpreter deshalb nie ausgewertet. Aus diesem Grund führt der letzte Aufruf mit der Division durch Null als Parameter nicht zu einem Fehler.
Solange also der Wert eines Ausdrucks (einer Funktion) nicht benötigt wird, behandelt "Haskell" diesen als eine Definition. Als solche werden auch entsprechende Teilausdrücke behandelt.

Pattern Matching: Ein Funktion kann mehrere Definitionen haben. Es wird per Pattern Matching anhand der aufrufenden Parameter entschieden, welche Definition angewendet wird.
Beispiel: Rekursive Funktion zum Berechnen von x Exponent y

xHochY :: Int -> Int -> Int
xHochY x 0 = 1
xHochY x _ = x * xHochY x (y-1)

Wenn y = 0 ist, wird die erste Definition verwendet. In allen anderen Fällen (_ ist Wildcard) wird die untere Definition verwendet. Die Funktion ist rekursiv und bricht nach y = 0 ab. Es wird jedoch nicht geprüft, ob kein y < 0 Parameter ist.

Currying: eine Funktion in gecurrieter Form erhält alle ihre Argumente auf einmal, also z. B. wenn wir x und y multiplizieren wollen, übergeben wir gleichzeitig x und y.

mult :: Int -> Int -> Int
mult x y = x * y


Die ungecurrierte Form sähe so aus:

mult :: (Int, Int) -> Int
mult (x, y) = x * y


Formale Parameter (FP): Namen für Parameter in der Funktionsdefinition, also die abstrakten.

Aktuelle Parameter (AP): Ausdrücke im Aufruf, deren Werte oder Stellen übergeben werden, also die konkreten, die beim Funktionsaufruf übergeben werden.

Call-by-Name: Bei der Parameterübergabe nach dem Mechanismus des call-by-name wird der Parameter als Referenz übergeben. In der aufgerufenen Methode kann man sich an jeder Stelle, wo der Parameter als lokale Variable verwendet wird, den Namen der beim Aufruf übergebenen Variable ersetzt denken. Kommt in der aufgerufenen Methode ein lokaler Name mit demselben Namen vor, so kann dies leicht zu ungewollten Effekten führen.
Beispiel:

int x = 3;
Function abc (int a)
{
int x = 5;
a = a + 5;
}
abc(x);
print(x);

Bei diesem Beispiel wird am Schluss nicht, wie man vielleicht vermutet, 8 ausgegeben, sondern 10, da in der Methode abc jedes Vorkommen von a durch x ersetzt werden kann und somit x = x + 5 = 5 + 5 berechnet wird.

Call-by-Value: Bei der Parameterübergabe nach dem Mechanismus des call-by-value wird eine Kopie der Variable übergeben. Wenn in der Methode der übergebene Parameter geändert wird, hat dies keine Auswirkung auf den Originalparameter.

Call-by-result: Bei der Parameterübergabe nach dem Mechanismus des call-by-value/result (auch call-by-copy/restore genannt) wird zunächst wie beim call-by-value verfahren, d.h. es wird nur eine Kopie der Variable übergeben. Wenn in der Methode der übergebene Parameter geändert wird, hat dies zunächst keine Auswirkung auf den Originalparameter. Am Ende der Methode wird allerdings der Wert der übergebenen Variable aus der aufrufenden Methode mit dem aktuellen Wert des Parameters überschrieben

Call-by-reference: Bei der Parameterübergabe nach dem Mechanismus des call-by-reference wird der Parameter als Referenz übergeben. Wird in der Methode der Wert des Parameters geändert, so wirkt sich dies auch auf den Wert der übergebenen Variable in der aufrufenden Methode aus. Die beiden Objekte zeigen auf dieselbe Speicheradresse, statt einer Kopie des Wertes wird die Speicheradresse übergeben.Dieser Übergabemechanismus wird beispielsweise in der Programmiersprache Java verwendet.

Higher-Order-Function: Eine Funktion, die als Parameter eine Funktion verarbeiten kann und auch eine Funktion zurück geben kann.
Beispiel:

squareList list = map (^2) list

Die Funktion squareList bekommt ^2 als Parameter übergeben.

Links

lazy evaluation bei Wikipedia (engl.)
weiterführendes zum Thema "lazy evaluation"
Folie zu Currying
higer order function bei Wikipedia (engl.)

Dokumente

als doc zum Drucken