Quellcode finden Sie hier: https://github.com/aelassas/Functional-ts
In TypeScript sind Funktionen nichts anderes als Objekte. Daher können Funktionen erstellt, als Parameter übergeben, von Funktionen zurückgegeben oder Variablen zugewiesen werden. Somit verfügt TypeScript über erstklassige Funktionen. Genauer gesagt unterstützt TypeScript Folgendes:
In diesem Artikel geht es nicht um die Grundlagen der funktionalen Programmierung, da Sie im Internet zahlreiche Ressourcen zu diesem Thema finden. Stattdessen geht es um funktionale Programmierung in TypeScript, angewendet auf Algebra, Zahlen, die euklidische Ebene und Fraktale. Die in diesem Artikel bereitgestellten Beispiele reichen von einfach bis komplexer, werden aber immer auf einfache, unkomplizierte und leicht verständliche Weise veranschaulicht.
Um den Quellcode auszuführen, müssen Sie Node.js installieren. Sobald Node.js installiert ist, laden Sie das Quellcode-Archiv herunter, entpacken Sie es, gehen Sie zu dem Quellcode-Ordner, den Sie auf einem Terminal entpackt haben, richten Sie die TypeScript-Umgebung ein und installieren Sie alle erforderlichen Abhängigkeiten mit dem folgenden Befehl:
npm install
Um die Numbers-Demo auszuführen, führen Sie den folgenden Befehl aus:
npm run numbers
Um die Demo des euklidischen Flugzeugs auszuführen, führen Sie den folgenden Befehl aus:
npm run plane
Um die Fractals-Demo auszuführen, führen Sie den folgenden Befehl aus:
npm run fractals
Sei S eine beliebige Menge der Elemente a, b, c ... (zum Beispiel die Bücher auf dem Tisch oder die Punkte der euklidischen Ebene) und sei S' eine beliebige Teilmenge dieser Elemente (zum Beispiel die grüne Bücher auf dem Tisch oder die Punkte im Kreis mit Radius 1, der im Ursprung der euklidischen Ebene zentriert ist).
Die charakteristische Funktion S'(x) der Menge S' ist eine Funktion, die jedem Element x von S entweder wahr oder falsch zuordnet.
S'(x) = true if x is in S' S'(x) = false if x is not in S'
Sei S die Menge der Bücher auf dem Tisch und sei S' die Menge der grünen Bücher auf dem Tisch. Seien a und b zwei grüne Bücher und seien c und d zwei rote Bücher auf dem Tisch. Dann:
npm install
Sei S die Menge der Punkte in der euklidischen Ebene und sei S' die Menge der Punkte im Kreis mit Radius 1, der im Ursprung der euklidischen Ebene (0, 0) (Einheitskreis) zentriert ist. Seien a und b zwei Punkte im Einheitskreis und seien c und d zwei Punkte in einem Kreis mit Radius 2, dessen Mittelpunkt im Ursprung der euklidischen Ebene liegt. Dann:
npm run numbers
Somit kann jede Menge S' immer durch ihre charakteristische Funktion dargestellt werden. Eine Funktion, die ein Element als Argument verwendet und true zurückgibt, wenn dieses Element in S' ist, andernfalls false. Mit anderen Worten, eine Menge (abstrakter Datentyp) kann durch eine Funktion in TypeScript dargestellt werden.
npm run plane
In den nächsten Abschnitten werden wir sehen, wie wir einige grundlegende Mengen in der Mengenalgebra durch TypeScript auf funktionale Weise darstellen können, und dann werden wir generische binäre Operationen für Mengen definieren. Wir werden diese Operationen dann auf Zahlen und dann auf Teilmengen der euklidischen Ebene anwenden. Mengen sind abstrakte Datenstrukturen, die Teilmengen von Zahlen und die Teilmengen der euklidischen Ebene sind die Darstellung abstrakter Datenstrukturen und schließlich sind die binären Operationen die generische Logik, die auf jede Darstellung der abstrakten Datenstrukturen funktioniert.
In diesem Abschnitt wird die Darstellung einiger grundlegender Mengen in der Mengenalgebra durch TypeScript vorgestellt.
Es sei E die leere Menge und leere ihre charakteristische Funktion. In der Mengenalgebra ist E die eindeutige Menge ohne Elemente. Daher kann Empty wie folgt definiert werden:
npm run fractals
Daher kann die Darstellung von E in TypeScript wie folgt definiert werden:
S'(x) = true if x is in S' S'(x) = false if x is not in S'
In der Mengenalgebra wird Empty wie folgt dargestellt:
Führen Sie also den folgenden Code aus:
S'(a) = S'(b) = true S'(c) = S'(d) = false
gibt die folgenden Ergebnisse:
Sei S eine Menge und S' die Teilmenge von S, die alle Elemente und alle ihre charakteristischen Funktionen enthält. In der Mengenalgebra ist S' die vollständige Menge, die alle Elemente enthält. Daher kann „Alle“ wie folgt definiert werden:
S'(a) = S'(b) = true S'(c) = S'(d) = false
Daher kann die Darstellung von S' in TypeScript wie folgt definiert werden:
type Set<T> = (x: T) => boolean
In der Mengenalgebra wird „All“ wie folgt dargestellt:
Führen Sie also den folgenden Code aus:
npm install
gibt die folgenden Ergebnisse:
Es sei E die Singleton-Menge und Singleton seine charakteristische Funktion. In der Mengenalgebra ist E, auch Einheitsmenge oder 1-Tupel genannt, eine Menge mit genau einem Element e. Daher kann Singleton wie folgt definiert werden:
npm run numbers
Daher kann die Darstellung von E in TypeScript wie folgt definiert werden:
npm run plane
Führen Sie also den folgenden Code aus:
npm run fractals
gibt die folgenden Ergebnisse:
In diesem Abschnitt werden Teilmengen der Ganzzahlmenge vorgestellt.
Es sei E die Menge der geraden Zahlen und gerade ihre charakteristische Funktion. In der Mathematik ist eine gerade Zahl eine Zahl, die ein Vielfaches von zwei ist. Daher kann Even wie folgt definiert werden:
S'(x) = true if x is in S' S'(x) = false if x is not in S'
Daher kann die Darstellung von E in TypeScript wie folgt definiert werden:
S'(a) = S'(b) = true S'(c) = S'(d) = false
Führen Sie also den folgenden Code aus:
S'(a) = S'(b) = true S'(c) = S'(d) = false
gibt die folgenden Ergebnisse:
Es sei E die Menge der ungeraden Zahlen und Odd ihre charakteristische Funktion. In der Mathematik ist eine ungerade Zahl eine Zahl, die kein Vielfaches von zwei ist. Daher kann Odd wie folgt definiert werden:
type Set<T> = (x: T) => boolean
Daher kann die Darstellung von E in TypeScript wie folgt definiert werden:
Empty(x) = false if x is in E Empty(x) = false if x is not in E
Führen Sie also den folgenden Code aus:
const empty = () => (e: T) => false
gibt die folgenden Ergebnisse:
Es sei E die Menge der Vielfachen von 3 und MultipleOfThree seine charakteristische Funktion. In der Mathematik ist ein Vielfaches von 3 eine durch 3 teilbare Zahl. Daher kann MultipleOfThree wie folgt definiert werden:
console.log('\nEmpty set:') console.log('Is 7 in {}?', common.empty()(7))
Daher kann die Darstellung von E in TypeScript wie folgt definiert werden:
All(x) = true if x is in S
Führen Sie also den folgenden Code aus:
const all = () => (e: T) => true
gibt die folgenden Ergebnisse:
Es sei E die Menge der Vielfachen von 5 und MultipleOfFive seine charakteristische Funktion. In der Mathematik ist ein Vielfaches von 5 eine durch 5 teilbare Zahl. Daher kann MultipleOfFive wie folgt definiert werden:
npm install
Daher kann die Darstellung von E in TypeScript wie folgt definiert werden:
npm run numbers
Führen Sie also den folgenden Code aus:
npm run plane
gibt die folgenden Ergebnisse:
Vor langer Zeit, als ich mit Project Euler-Problemen herumspielte, musste ich Folgendes lösen:
npm run fractals
Um dieses Problem zu lösen, musste ich zunächst einen schnellen Algorithmus schreiben, der prüft, ob eine gegebene Zahl eine Primzahl ist oder nicht. Nachdem der Algorithmus geschrieben war, habe ich einen iterativen Algorithmus geschrieben, der Primzahlen durchläuft, bis die 10.001. Primzahl gefunden wurde.
Es sei E die Menge der Primzahlen und Prim ihre charakteristische Funktion. In der Mathematik ist eine Primzahl eine natürliche Zahl größer als 1, die außer 1 und sich selbst keine positiven Teiler hat. Daher kann Prime wie folgt definiert werden:
S'(x) = true if x is in S' S'(x) = false if x is not in S'
Daher kann die Darstellung von E in TypeScript wie folgt definiert werden:
S'(a) = S'(b) = true S'(c) = S'(d) = false
Führen Sie daher den folgenden Code aus, um unser Problem zu lösen:
S'(a) = S'(b) = true S'(c) = S'(d) = false
wobei getPrime unten definiert ist:
type Set<T> = (x: T) => boolean
gibt die folgenden Ergebnisse:
In diesem Abschnitt werden mehrere grundlegende Operationen zum Konstruieren neuer Mengen aus gegebenen Mengen und zum Manipulieren von Mengen vorgestellt. Unten das Ven-Diagramm in der Mengenalgebra.
Es seien E und F zwei Mengen. Die Vereinigung von E und F, bezeichnet mit E U F, ist die Menge aller Elemente, die Mitglieder von E und F sind.
Lassen Sie Union die Union Operation sein. Somit kann die Union-Operation wie folgt in TypeScript implementiert werden:
Empty(x) = false if x is in E Empty(x) = false if x is not in E
Führen Sie den folgenden Code aus:
const empty = () => (e: T) => false
gibt die folgenden Ergebnisse:
Es seien E und F zwei Mengen. Der Schnittpunkt von E und F, bezeichnet mit E n F, ist die Menge aller Elemente, die Mitglieder von E und F sind.
Intersection sei die Operation Intersection. Somit kann die Intersection-Operation wie folgt in TypeScript implementiert werden:
console.log('\nEmpty set:') console.log('Is 7 in {}?', common.empty()(7))
Führen Sie den folgenden Code aus:
All(x) = true if x is in S
gibt die folgenden Ergebnisse:
Es seien E und F zwei Mengen. Das kartesische Produkt von E und F, bezeichnet mit E × F, ist die Menge aller geordneten Paare (e, f), so dass e ein Mitglied von E und f ein Mitglied von F ist.
CartesianProduct sei die Operation kartesisches Produkt. Somit kann die CartesianProduct-Operation wie folgt in TypeScript implementiert werden:
npm install
Führen Sie den folgenden Code aus:
npm run numbers
gibt die folgenden Ergebnisse:
Es seien E und F zwei Mengen. Das Relativkomplement von F in E, bezeichnet mit E F, ist die Menge aller Elemente, die Mitglieder von E, aber nicht Mitglieder von F sind.
Komplement sei die relative Komplementoperation. Somit kann die Complement-Operation wie folgt in TypeScript implementiert werden:
npm run plane
npm run fractals
gibt die folgenden Ergebnisse:
Es seien E und F zwei Mengen. Die symmetrische Differenz von E und F, bezeichnet mit E Δ F, ist die Menge aller Elemente, die Mitglieder von E und F sind, aber nicht im Schnittpunkt von E und F.
SymetrischeDifferenz sei die Operation symmetrische Differenz. Somit kann die SymmetricDifference-Operation in TypeScript auf zwei Arten implementiert werden. Eine triviale Möglichkeit besteht darin, die Vereinigungs- und Komplementoperationen wie folgt zu verwenden:
S'(x) = true if x is in S' S'(x) = false if x is not in S'
Eine andere Möglichkeit besteht darin, die XOR-Binäroperation wie folgt zu verwenden:
S'(a) = S'(b) = true S'(c) = S'(d) = false
Führen Sie den folgenden Code aus:
S'(a) = S'(b) = true S'(c) = S'(d) = false
gibt die folgenden Ergebnisse:
In diesem Abschnitt werden weitere nützliche binäre Operationen für Mengen vorgestellt.
Contains sei die Operation, die prüft, ob ein Element in einer Menge enthalten ist oder nicht. Bei dieser Operation handelt es sich um eine Funktion, die ein Element als Parameter verwendet und „true“ zurückgibt, wenn das Element in der Menge enthalten ist, andernfalls „false“.
Daher ist dieser Vorgang in TypeScript wie folgt definiert:
type Set<T> = (x: T) => boolean
Führen Sie daher den folgenden Code aus:
npm install
gibt das folgende Ergebnis:
Add sei die Operation, die ein Element zu einer Menge hinzufügt. Bei dieser Operation handelt es sich um eine Funktion, die ein Element als Parameter nimmt und es der Menge hinzufügt.
Daher ist dieser Vorgang in TypeScript wie folgt definiert:
npm run numbers
Führen Sie daher den folgenden Code aus:
npm run plane
gibt das folgende Ergebnis:
Entfernen sei die Operation, die ein Element aus einer Menge entfernt. Bei dieser Operation handelt es sich um eine Funktion, die ein Element als Parameter annimmt und es aus der Menge entfernt.
Daher ist dieser Vorgang in TypeScript wie folgt definiert:
npm run fractals
Führen Sie daher den folgenden Code aus:
S'(x) = true if x is in S' S'(x) = false if x is not in S'
gibt das folgende Ergebnis:
Sie können sehen, wie einfach wir mit der Funktionalen Programmierung eine Mengenalgebra in TypeScript durchführen können. In den vorherigen Abschnitten wurden die grundlegendsten Definitionen gezeigt. Aber wenn Sie noch weiter gehen möchten, können Sie über Folgendes nachdenken:
Im vorherigen Abschnitt wurden die grundlegenden Konzepte zu Mengen in TypeScript implementiert. In diesem Abschnitt üben wir die auf der euklidischen Ebene implementierten Konzepte.
Eine Scheibe ist eine Teilmenge einer Ebene, die von einem Kreis begrenzt wird. Es gibt zwei Arten von Datenträgern. Geschlossene Scheiben, die Scheiben sind, die die Punkte des Kreises enthalten, der seine Grenze bildet, und Offene Scheiben, die Scheiben sind, die nicht die Punkte des Kreises enthalten, der seine Grenze bildet.
In diesem Abschnitt richten wir die Charakterfunktion der geschlossenen Festplatte ein und zeichnen sie in einer HTML5-Seite.
Um die Charakteristische Funktion einzurichten, benötigen wir zunächst eine Funktion, die den Euklidischen Abstand zwischen zwei Punkten in der Ebene berechnet. Diese Funktion wird wie folgt implementiert:
S'(a) = S'(b) = true S'(c) = S'(d) = false
wobei Punkt unten definiert ist:
S'(a) = S'(b) = true S'(c) = S'(d) = false
Diese Formel basiert auf dem Satz des Pythagoras.
wobei c der Euklidische Abstand ist, a² ist (p1.X - p2.X)² und b² ist (p1.Y - p2.Y)².
Die Festplatte sei die charakteristische Funktion einer geschlossenen Festplatte. In der Mengenalgebra lautet die Definition einer geschlossenen Scheibe in der reellen Menge wie folgt:
wobei a und b die Koordinaten des Mittelpunkts und R der Radius sind.
Die Implementierung von Disk in TypeScript ist also wie folgt:
npm install
Um die Menge auf einer HTML5-Seite anzuzeigen, habe ich beschlossen, eine Funktion „Draw“ zu implementieren, die eine Menge in der Euklidischen Ebene zeichnet. Ich habe HTML5 gewählt und somit das Canvas-Element zum Zeichnen verwendet.
So habe ich die unten dargestellte Euklidische Ebene mithilfe der Methode „Zeichnen“ erstellt.
Unten die Umsetzung des Flugzeugs.
npm run numbers
In der Zeichenfunktion wird eine Leinwand mit derselben Breite und derselben Höhe wie der Euklidische Ebene-Container erstellt. Dann wird jeder Punkt in Pixeln (x,y) der Leinwand durch einen schwarzen Punkt ersetzt, wenn er zur Menge gehört. xMin, xMax, yMin und yMax sind die in der Abbildung der Euklidischen Ebene oben dargestellten Grenzwerte.
Führen Sie den folgenden Code aus:
npm run plane
wobei disk die ID der Leinwand ist:
npm run fractals
gibt das folgende Ergebnis:
Eine horizontale oder eine vertikale Halbebene ist eine der beiden Teilmengen, in die eine Ebene den euklidischen Raum unterteilt. Eine horizontale Halbebene ist eine der beiden Teilmengen, in die eine Ebene den euklidischen Raum durch eine Linie senkrecht zur Y-Achse teilt, wie in der Abbildung oben. Eine vertikale Halbebene ist eine der beiden Teilmengen, in die eine Ebene den euklidischen Raum durch eine Linie senkrecht zur X-Achse teilt.
In diesem Abschnitt werden wir die charakteristischen Funktionen der horizontalen und vertikalen Halbebenen einrichten, sie auf einer HTML5-Seite zeichnen und sehen, was passiert Wir können dies tun, wenn wir sie mit der Teilmenge disk kombinieren.
HorizontalHalfPlane sei die charakteristische Funktion einer horizontalen Halbebene. Die Implementierung von HorizontalHalfPlane in TypeScript ist wie folgt:
S'(x) = true if x is in S' S'(x) = false if x is not in S'
Führen Sie also den folgenden Code aus:
npm install
wobei hhp die ID der Leinwand ist:
npm run numbers
gibt das folgende Ergebnis:
VerticalHalfPlane sei die charakteristische Funktion einer vertikalen Halbebene. Die Implementierung von VerticalHalfPlane in TypeScript ist wie folgt:
npm run plane
npm run fractals
wobei vhd die ID der Leinwand ist:
S'(x) = true if x is in S' S'(x) = false if x is not in S'
gibt das folgende Ergebnis:
Im ersten Abschnitt des Artikels richten wir grundlegende binäre Operationen für Mengen ein. Indem wir beispielsweise den Schnittpunkt einer Scheibe und einer Halbebene kombinieren, können wir die Teilmenge der Halbscheibe zeichnen.
Führen Sie daher das folgende Beispiel aus:
S'(a) = S'(b) = true S'(c) = S'(d) = false
wobei hd die ID der Leinwand ist:
S'(a) = S'(b) = true S'(c) = S'(d) = false
gibt das folgende Ergebnis:
In diesem Abschnitt werden Funktionen für die Mengen in der euklidischen Ebene vorgestellt.
TranslatePoint sei die Funktion, die einen Punkt in der Ebene übersetzt. In der euklidischen Geometrie ist TranslatePoint eine Funktion, die einen bestimmten Punkt um eine konstante Distanz in eine bestimmte Richtung verschiebt. Somit ist die Implementierung in TypeScript wie folgt:
type Set<T> = (x: T) => boolean
wobei (deltax, deltay) der konstante Vektor der Übersetzung ist.
Translate sei die Funktion, die eine Menge in der Ebene verschiebt. Diese Funktion wird einfach wie folgt in TypeScript implementiert:
Empty(x) = false if x is in E Empty(x) = false if x is not in E
const empty = () => (e: T) => false
wobei ep_op die ID der Leinwand ist:
console.log('\nEmpty set:') console.log('Is 7 in {}?', common.empty()(7))
gibt das folgende Ergebnis:
ScalePoint sei die Funktion, die jeden Punkt M an einen anderen Punkt N sendet, sodass das Segment SN auf derselben Linie wie SM liegt , jedoch skaliert um einen Faktor λ. In der Mengenalgebra wird Scale wie folgt formuliert:
Die Implementierung in TypeScript ist also wie folgt:
npm install
wobei (deltax, deltay) der konstante Vektor der Übersetzung und (lambdax, lambday) der Lambda-Vektor ist.
Maßstab sei die Funktion, die eine Homothetie auf eine Menge im Plan anwendet. Diese Funktion wird einfach wie folgt in TypeScript implementiert:
npm run numbers
scale verwendet als Parameter deltax, das ist der Delta-Abstand in der ersten euklidischen Dimension, deltay, das ist der Delta-Abstand in der zweiten euklidischen Dimension, und (lambdax, lambday), der der konstante Faktorvektor λ ist. Wenn ein Punkt P (x, y) durch die Skala in einer Menge S transformiert wird, ändern sich seine Koordinaten zu (x', y') = (lambdax * x, delatx, lambday * y, deltay). Somit gehört der Punkt ((x'- delatx)/lambdax, (y' - deltay)/lambday) immer zur Menge S, wenn Lambda vom Vektor verschieden ist 0, natürlich. In der Mengenalgebra wird die Skala als Isomorph bezeichnet, mit anderen Worten: Die Menge aller Homotheten bildet die Homothetiegruppe H, die isomorph zum Raum selbst {0} ist. Dies erklärt die Hauptlogik der Funktion.
Führen Sie daher den folgenden Code auf unserer HTML5-Seite aus:
npm run plane
gibt das folgende Ergebnis:
RotatePoint sei die Funktion, die einen Punkt um einen Winkel θ dreht. In der Matrixalgebra wird rotatePoint wie folgt formuliert:
wobei (x', y') die Koordinaten des Punktes nach der Drehung sind und die Formel für x' und y' lautet wie folgt:
Die Demonstration dieser Formel ist sehr einfach. Schauen Sie sich diese Rotation an.
Unterhalb der Demonstration:
Die Implementierung in TypeScript ist also wie folgt:
npm install
Rotieren sei die Funktion, die eine Drehung auf eine Menge in der Ebene mit dem Winkel θ anwendet. Diese Funktion wird einfach wie folgt in TypeScript implementiert.
npm run numbers
rotate ist eine Funktion, die als Parameter Theta verwendet, also den Winkel der Drehung. Wenn ein Punkt P (x, y) durch Drehen in einer Menge S transformiert wird, ändern sich seine Koordinaten zu (x', y') = (x * cos(theta) - y * sin(theta), x * sin(theta), y * cos(theta)). Somit gehört der Punkt (x' * cos(theta), y' * sin(theta), y' * cos(theta) - x' * sin(theta)) immer zur Menge S. In der Algebra der Mengen wird Rotation als Isomorph bezeichnet, mit anderen Worten: Die Menge aller Rotationen bildet die Rotationsgruppe R, die isomorph zum Raum selbst ist. Dies erklärt die Hauptlogik der Funktion.
Führen Sie daher den folgenden Code auf unserer HTML5-Seite aus:
npm run plane
gibt das folgende Ergebnis:
Sehr einfach, nicht wahr? Für diejenigen, die noch weiter gehen möchten, können Sie diese erkunden:
Fraktale sind Mengen, die eine fraktale Dimension haben, die normalerweise ihre topologische Dimension überschreitet und zwischen den ganzen Zahlen liegen kann. Beispielsweise ist die Mandelbrotmenge ein Fraktal, das durch eine Familie komplexer quadratischer Polynome definiert ist:
npm run fractals
wobei c ein Komplex ist. Das Mandelbrot-Fraktal ist definiert als die Menge aller Punkte c, so dass die obige Sequenz nicht ins Unendliche entweicht. In der Mengenalgebra wird dies wie folgt formuliert:
Fraktale (abstrakter Datentyp) können in TypeScript immer wie folgt dargestellt werden:
S'(x) = true if x is in S' S'(x) = false if x is not in S'
Um Fraktale zeichnen zu können, musste ich Komplexe Zahlen manipulieren. Daher habe ich die folgende Complex-Klasse erstellt:
S'(a) = S'(b) = true S'(c) = S'(d) = false
Ich habe ein Mandelbrot-Fraktal (abstrakte Datentypdarstellung) P(z) = z^2 c erstellt, das unten verfügbar ist.
npm install
npm run numbers
Führen Sie also den folgenden Code aus:
npm run plane
wobei fractal die ID der Leinwand ist:
npm run fractals
gibt das folgende Ergebnis:
Für diejenigen, die noch weiter gehen möchten, können Sie diese erkunden:
Das ist es! Ich hoffe, die Lektüre hat Ihnen gefallen.
Das obige ist der detaillierte Inhalt vonFunktionale Programmierung in TypeScript. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!