Wie kann ich eine zusammengesetzte Funktion in einer funktionalen Sprache definieren, insbesondere mit Ocaml? Zum Beispiel, wenn ich eine Funktion schreibe, die die Negation des Ergebnisses einer anderen Funktion berechnet, das heißt: not(f(x))
wobei f(x)
einen booleschen Wert zurückgibt. Wie kann ich es definieren?
Gegeben eine Funktion f
, die den Typ hat:
Sie möchten in der Lage sein, eine andere Funktion zu generieren, die es umschließt, um das Ergebnis zu negieren. Lassen Sie uns den Typ für diese neue Funktion betrachten, nennen wir sie negated
(ich verwende nicht not
, da es der Name eines eingebauten Objekts ist):
Warum ist das der Typ? Warum nicht 'a -> bool
? Denken Sie daran, wir möchten, dass diese neue Funktion eine vorhandene Funktion übernimmt und eine neue Funktion mit demselben Typ zurückgibt, der etwas anderes tut. Um es klarer zu sehen, können Sie es sich so vorstellen: ('a -> bool) -> ('a -> bool)
was äquivalent ist.
Wie können wir nun die Funktion negated
schreiben?
Nun müssen wir zuerst berücksichtigen, dass diese Funktion eine Funktion zurückgeben muss:
%Vor% Was kommt als nächstes? Nun, wir wissen, dass die neue Funktion, die wir erstellen, unsere umbrochene Funktion mit dem Argument aufrufen und negieren soll. Lassen Sie uns das tun, rufen Sie die Funktion mit dem Argument f x
auf und negieren Sie sie: not (f x)
. Das gibt uns die endgültige Funktionsdefinition:
Sehen wir es in Aktion:
%Vor%Ich bin mir nicht sicher, wie weit du hier hin willst - der Code, den du geschrieben hast, wird gut funktionieren. Also werde ich Ihnen Schritt für Schritt erklären, wie Sie dieses Zeug von Grund auf schreiben. Einfache Negation ist nur:
%Vor% Sie können not (f x)
schreiben und erhalten die Negation des Ergebnisses von f x
.
Für eine Funktion, die Funktionen zusammenstellt, können Sie verwenden:
%Vor%Also können wir tun:
%Vor%Wow, was ist mit all diesen übermäßig komplizierten Antworten? Was ist los mit:
%Vor% Um Ihre g(x) = not(f(x))
zu erhalten, vorausgesetzt, Sie haben eine f : 'a -> bool
:
Außerdem kannst du coole Sachen machen wie:
%Vor% Nun hat composite_function
den Typ int -> int
und seine effektive Definition lautet:
BEARBEITEN: Oh, ich denke, Chuck hat das tatsächlich getan. Ich hätte wahrscheinlich nicht einfach überfliegen sollen. Jedenfalls mag ich es, die Compose-Funktion zusammenzufalten, also werde ich weitermachen. : p
Tags und Links functional-programming ocaml function-composition