Zitat Wikipedia (Dieses Beispiel ist mehr oder weniger aus Typen und Programmiersprachen von Benjamin C. Pierce kopiert):
A combinator ist eine Funktion höherer Ordnung, die nur Funktionsanwendung verwendet und früher definierte Kombinatoren, um ein Ergebnis aus seinen Argumenten zu definieren.
Was bedeutet das nun? Es bedeutet, dass ein Kombinator eine Funktion ist (die Ausgabe wird ausschließlich durch ihre Eingabe bestimmt), deren Eingabe eine Funktion als Argument enthält.
Wie sehen solche Funktionen aus und wofür werden sie verwendet? Hier sind einige Beispiele:
(f o g)(x) = f(g(x))
o
hier ist ein Kombinator, der in 2-Funktionen übernimmt, f
und g
und gibt eine Funktion als Ergebnis der Zusammensetzung des f
mit g
, nämlich f o g
.
Kombinatoren können verwendet werden, um Logik zu verstecken. Angenommen, wir haben einen Datentyp NumberUndefined
, wobei NumberUndefined
einen numerischen Wert Num x
oder einen Wert Undefined
annehmen kann, wobei x
ein Number
ist. Nun wollen wir Addition, Subtraktion, Multiplikation und Division für diesen neuen numerischen Typ konstruieren. Die Semantik ist dieselbe wie für die von Number
, außer wenn Undefined
ein Eingang ist, muss der Ausgang auch Undefined
sein und wenn durch die Nummer 0
dividiert wird, ist der Ausgang auch Undefined
.
Man könnte die langweilige Code schreiben, wie folgt:
Undefined +' num = Undefined
num +' Undefined = Undefined
(Num x) +' (Num y) = Num (x + y)
Undefined -' num = Undefined
num -' Undefined = Undefined
(Num x) -' (Num y) = Num (x - y)
Undefined *' num = Undefined
num *' Undefined = Undefined
(Num x) *' (Num y) = Num (x * y)
Undefined /' num = Undefined
num /' Undefined = Undefined
(Num x) /' (Num y) = if y == 0 then Undefined else Num (x/y)
Beachten Sie, wie die alle die gleiche Logik über Undefined
Eingangswerte haben. Nur Division macht ein bisschen mehr. Die Lösung besteht darin, die Logik zu extrahieren, indem man sie zu einem Kombinator macht.
comb (~) Undefined num = Undefined
comb (~) num Undefined = Undefined
comb (~) (Num x) (Num y) = Num (x ~ y)
x +' y = comb (+) x y
x -' y = comb (-) x y
x *' y = comb (*) x y
x /' y = if y == Num 0 then Undefined else comb (/) x y
Dies kann in die sogenannten Maybe
Monade verallgemeinert werden, die Programmierer Verwendung in funktionalen Sprachen wie Haskell zu machen, aber ich werde nicht dorthin gehen.
ich für etwas ein bisschen mehr einführende als die dreamsongs man gehofft wurde. Vielleicht mit etwas mehr Motivation darüber, welches Problem sie adressieren usw. – interstar