Dieses Mal werde ich über funktionale Programmierung aus einer objektorientierten Perspektive schreiben.
Es gibt viele Kontroversen darüber, aber ich finde es richtig, die Übersetzung von "Objekt" für Objekte zu erraten.
Dies bedeutet, dass das Objekt selbst auch ein Wert ist. Ein einfaches Beispiel ist unten in ** Java ** gezeigt.
public class Foo {
private int value;
Foo (v) {
this.value = v;
}
public add_foo (v) {
this.value += v;
}
}
public class Test_Foo {
public static void main (String[] args) {
Foo foo = new Foo(5);
}
}
Foo foo = new Foo(5); Um einen kleinen Kreisverkehr zu erklären, Der Typ der Variablen foo ist Foo, und eine Instanz von Foo wird foo zugewiesen. Es wird sein.
Um genau zu sein, sollte es ein Zeiger sein und die Instanz am Punkt speichern.
Vielleicht mache ich es gut in Java. Ein Beispiel ist das Bedienen einer Zeichenfolge. Die Funktion gibt das Ergebnis direkt zurück, aber ist es nicht möglich, Zeichenfolgen bequem zu handhaben?
Das Thema ist dies. Fügen wir dem Wert 3 eine Methode hinzu. Wie kann ich es tun? Erben Sie in Java die wie folgt geschriebene Klasse und fügen Sie Methoden hinzu: Die Idee ist, die hinzugefügte Methode zu verwenden,
public class IFT {
private int v;
IFT (int v) {
this.v = v;
}
public int value () {
return v;
}
}
Mit Javascript können Sie so schreiben.
class MonoInt {
constructor (v) {
this.v = v;
}
static of (v) {
return new MonoInt(v);
}
get join () {
return this.v;
}
map (f) {
return MonoInt.of(f(this.v));
}
bind (f) {
return this.map(f).join;
}
}
MonoInt.of(3).map(v => v + 3).join; // 6
MonoInt.of(5).bind(v => Monoint.of(v * 8)).join; // 40
Eine Pfeilfunktion, λ (Lambda), die von Java8 usw. verwendet werden kann, ist herausgekommen. Zu diesem Zeitpunkt nimmt MonoInt nur einen Wert und schreibt den Code unter der Bedingung, dass er nicht auf einen Wert von außen verweist und ihn nicht hinzufügt.
Ein Objekt hat einen ** Wert **, der als Eigenschaft bezeichnet wird, und ist ein Implementierungskonzept einer ** natürlichen Transformation **, die als Methode bezeichnet wird. Und wenn das Objekt selbst auch ein Wert ist, wenn Sie den obigen Code wie folgt ändern ...
class Foo {
constructor (v) {
this.value = v;
this.key = "foo";
}
get oo () {
return this.v;
}
set oo (v) {
this.v = v;
}
resetKey (v) {
this.key = "foo" + v;
}
}
class Fix {
constructor (v) {
this.v = v;
}
static of (v) {
return new Fix(v);
}
get join () {
return this.v;
}
map (f) {
return Fix.of(f(this.v));
}
bind (f) {
return this.map(f).join;
}
re (f) {
this.map(f);
return this;
}
assign (o) {
return this.re(v => Object.assign(v, o));
}
}
Fix.of(new Foo(5)).map(foo => foo.oo).map(v => v + 3).join
// 8
Fix.of(new Foo(5)).re(foo => foo.oo += 3).assign(["bar", "baz"])).join
/*
Foo {
"0": "bar",
"1": "baz",
value: 8,
key: "foo"
}
*/
Eine Funktion, die das Objekt in großen Mengen verarbeitet, auch wenn die Methode des Objekts nichts zurückgibt Ich konnte ** re ** implementieren. Dies ermöglicht es uns, ** assign ** zu implementieren, das Object.assign delegieren kann.
Wenn Sie eine Methode hinzufügen, die intern re, map und bind verwendet, indem Sie den Fix-Body oder eine Klasse verwenden, die Fix erbt, können Sie die Methode so ausführen, als ob das Objekt sie ursprünglich hätte. ..
Zu diesem Zeitpunkt muss der zugewiesene Objektkörper nicht über diese Methode verfügen.
Um genau zu sein, scheinen die Monaden, die Endo (Redo) ausführen können, zusätzliche Monaden zu sein. Es ist praktisch, deshalb möchte ich es immer mehr integrieren.
Wenn Sie Korrekturen oder Vorschläge haben, werden wir aufrichtig antworten. Vielen Dank, dass Sie bis zum Ende bei uns bleiben.
Recommended Posts