Was ist der Unterschied zwischen funktionalen und imperativen Programmiersprachen?

159

Die meisten gängigen Sprachen, einschließlich objektorientierter Programmiersprachen (OOP) wie C #, Visual Basic, C ++ und Java, wurden hauptsächlich zur Unterstützung der imperativen (prozeduralen) Programmierung entwickelt, während Haskell / Gofer-ähnliche Sprachen rein funktional sind. Kann jemand näher auf den Unterschied zwischen diesen beiden Programmierarten eingehen?

Ich weiß, dass es von den Benutzeranforderungen abhängt, die Art der Programmierung zu wählen, aber warum wird empfohlen, funktionale Programmiersprachen zu lernen?

Swapnil Kotwal
quelle
1
mögliches Duplikat der funktionalen Programmierung vs objektorientierte Programmierung
Floris Velleman
1
Überprüfen Sie diesen anderen [Beitrag] [1]. Es beschreibt klar die Unterschiede. [1]: stackoverflow.com/questions/602444/…
Theta

Antworten:

160

Definition: Eine imperative Sprache verwendet eine Folge von Anweisungen, um zu bestimmen, wie ein bestimmtes Ziel erreicht werden soll. Diese Anweisungen sollen den Status des Programms ändern, wenn jede nacheinander ausgeführt wird.

Beispiele: Java ist eine zwingende Sprache. Beispielsweise kann ein Programm erstellt werden, um eine Reihe von Zahlen hinzuzufügen:

 int total = 0;
 int number1 = 5;
 int number2 = 10;
 int number3 = 15;
 total = number1 + number2 + number3; 

Jede Anweisung ändert den Status des Programms, von der Zuweisung von Werten zu jeder Variablen bis zur endgültigen Addition dieser Werte. Anhand einer Folge von fünf Anweisungen wird dem Programm ausdrücklich mitgeteilt, wie die Zahlen 5, 10 und 15 addiert werden sollen.

Funktionale Sprachen: Das funktionale Programmierparadigma wurde explizit entwickelt, um einen rein funktionalen Ansatz zur Problemlösung zu unterstützen. Funktionale Programmierung ist eine Form der deklarativen Programmierung.

Vorteile reiner Funktionen: Der Hauptgrund für die Implementierung funktionaler Transformationen als reine Funktionen besteht darin, dass reine Funktionen zusammensetzbar sind: in sich geschlossen und zustandslos. Diese Eigenschaften bieten eine Reihe von Vorteilen, darunter die folgenden: Verbesserte Lesbarkeit und Wartbarkeit. Dies liegt daran, dass jede Funktion aufgrund ihrer Argumente eine bestimmte Aufgabe erfüllen soll. Die Funktion ist nicht auf einen externen Status angewiesen.

Einfachere wiederholte Entwicklung. Da der Code einfacher umzugestalten ist, sind Änderungen am Design häufig einfacher zu implementieren. Angenommen, Sie schreiben eine komplizierte Transformation und stellen dann fest, dass ein Teil des Codes in der Transformation mehrmals wiederholt wird. Wenn Sie eine reine Methode umgestalten, können Sie Ihre reine Methode nach Belieben aufrufen, ohne sich um Nebenwirkungen sorgen zu müssen.

Einfacheres Testen und Debuggen. Da reine Funktionen einfacher isoliert getestet werden können, können Sie Testcode schreiben, der die reine Funktion mit typischen Werten, gültigen Kantenfällen und ungültigen Kantenfällen aufruft.

Für OOP-Personen oder imperative Sprachen:

Objektorientierte Sprachen sind gut, wenn Sie einen festen Satz von Operationen für Dinge haben und wenn sich Ihr Code weiterentwickelt, fügen Sie hauptsächlich neue Dinge hinzu. Dies kann erreicht werden, indem neue Klassen hinzugefügt werden, die vorhandene Methoden implementieren, und die vorhandenen Klassen werden in Ruhe gelassen.

Funktionale Sprachen sind gut, wenn Sie einen festen Satz von Dingen haben und wenn sich Ihr Code weiterentwickelt, fügen Sie hauptsächlich neue Operationen für vorhandene Dinge hinzu. Dies kann erreicht werden, indem neue Funktionen hinzugefügt werden, die mit vorhandenen Datentypen rechnen und die vorhandenen Funktionen in Ruhe gelassen werden.

Nachteile:

Es hängt von den Benutzeranforderungen ab, die Art der Programmierung zu wählen. Daher kann es nur dann schaden, wenn Benutzer nicht die richtige Art der Programmierung wählen.

Wenn die Evolution in die falsche Richtung geht, haben Sie Probleme:

  • Das Hinzufügen einer neuen Operation zu einem objektorientierten Programm erfordert möglicherweise das Bearbeiten vieler Klassendefinitionen, um eine neue Methode hinzuzufügen
  • Das Hinzufügen einer neuen Art zu einem Funktionsprogramm erfordert möglicherweise das Bearbeiten vieler Funktionsdefinitionen, um einen neuen Fall hinzuzufügen.
Chris
quelle
10
Eine reine Funktion ist in diesem Fall das Äquivalent einer mathematischen Funktion. Dieselben Eingänge werden immer denselben Ausgängen zugeordnet. Sie haben auch keine Nebenwirkungen (außer der Rückgabe eines Werts oder von Werten), was bedeutet, dass der Compiler einige coole Optimierungen vornehmen kann und es einfacher macht, die Funktion parallel auszuführen, da es nichts zu bewältigen gibt.
WorBlux
Die richtigen Methoden und Best Practices für das Erstellen wartbarer und testbarer oop-Anwendungen bestehen also darin, imperativen Code mit einem deklerativen Geisteszustand zu entwerfen.
Kemal Gültekin
4
Ich sehe keinen deutlichen Unterschied im Text, in dem die Merkmale jeder Programmierung hervorgehoben sind. Der größte Teil der Beschreibung für die prozedurale Programmierung kann durch den imperativen Programmiertext ausgetauscht werden und umgekehrt.
AxeEffect
7
Diese Antwort versucht zu klären, was funktionale Programmierung ist, macht sich aber nicht einmal die Mühe zu definieren, was eine reine Funktion ist. Ich sehe nicht ein, wie jemand diese Antwort lesen und sich sicher fühlen kann, den Unterschied zwischen deklarativer und prozeduraler Programmierung zu kennen.
Ringo
230

Hier ist der Unterschied:

Imperativ:

  • Anfang
  • Schalten Sie Ihre Schuhe Größe 9 1/2.
  • Machen Sie Platz in Ihrer Tasche, um eine Reihe [7] von Schlüsseln aufzubewahren.
  • Stecken Sie die Schlüssel in den Raum für die Schlüssel in der Tasche.
  • Garage betreten.
  • Garage öffnen.
  • Auto betreten.

... und so weiter und so fort ...

  • Die Milch in den Kühlschrank stellen.
  • Halt.

Deklarativ, wovon funktional eine Unterkategorie ist:

  • Milch ist ein gesundes Getränk, es sei denn, Sie haben Probleme, Laktose zu verdauen.
  • Normalerweise lagert man Milch im Kühlschrank.
  • Ein Kühlschrank ist eine Box, die die darin enthaltenen Dinge kühl hält.
  • Ein Geschäft ist ein Ort, an dem Artikel verkauft werden.
  • Mit "verkaufen" meinen wir den Austausch von Dingen gegen Geld.
  • Auch der Austausch von Geld gegen Dinge wird "Kaufen" genannt.

... und so weiter und so fort ...

  • Stellen Sie sicher, dass wir Milch im Kühlschrank haben (wenn wir sie brauchen - für faule funktionale Sprachen).

Zusammenfassung: In imperativen Sprachen teilen Sie dem Computer mit, wie und in welcher Reihenfolge Bits, Bytes und Wörter im Speicher geändert werden sollen. In funktionalen teilen wir dem Computer mit, was Dinge, Aktionen usw. sind. Zum Beispiel sagen wir, dass die Fakultät 0 0 ist und die Fakultät jeder anderen natürlichen Zahl das Produkt dieser Zahl und die Fakultät ihres Vorgängers ist. Wir sagen nicht: Um die Fakultät von n zu berechnen, reservieren Sie einen Speicherbereich und speichern Sie dort 1, multiplizieren Sie dann die Zahl in diesem Speicherbereich mit den Zahlen 2 bis n und speichern Sie das Ergebnis an derselben Stelle und am Ende. Der Speicherbereich enthält die Fakultät.

Ingo
quelle
1
Danke dir. Das ist eine großartige Möglichkeit, es zu betrachten.
L-Samuels
4
Ich mochte Ihre Erklärung @Igno, aber etwas ist mir noch unklar. In Declarative müssen Sie zwar nur Dinge erzählen , aber dennoch die Bits ändern und die Zustände in der Maschine ändern, um richtig fortzufahren. Es macht mich verwirrt, dass Declarative der prozeduralen Programmierung (wie C-Funktionen) ähnlich ist und es dennoch intern einen großen Unterschied zwischen ihnen gibt. Ist das nicht C Funktionen gleiche wie Funktionen in Funktionale Programmierung (auf Maschinenebene)?
Phoenix
10
@Igno, wie Subroto, ich verstehe deine Erklärung nicht wirklich. Es scheint, als ob das, was Sie geschrieben haben, wie folgt zusammengefasst werden kann: Benötigen Sie eine Antwort ... erhalten Sie eine Antwort. es scheint die wichtigen Teile zu ignorieren, wie. Ich verstehe nicht, wie Sie diesen Teil einfach vor dem Benutzer verbergen können. Irgendwann muss jemand wissen, wie es gemacht wurde. Sie können den Assistenten nicht für immer hinter dem Vorhang lassen.
Brett Thomas
3
Dies ist nicht im entferntesten das, was ich unter funktionaler Programmierung verstehe. Ich dachte, funktionale Programmierung sei das Entfernen versteckter Ein- und Ausgänge von Funktionen.
Ringo
6
Verschachtelte Erklärung.
JoeTidee
14

Die meisten modernen Sprachen sind in unterschiedlichem Maße sowohl imperativ als auch funktional. Um die funktionale Programmierung besser zu verstehen, ist es am besten, ein Beispiel für eine reine funktionale Sprache wie Haskell im Gegensatz zu imperativem Code in einer nicht so funktionalen Sprache wie Java / C # zu nehmen. Ich glaube, es ist immer einfach, dies anhand eines Beispiels zu erklären.

Funktionale Programmierung: Berechnen Sie die Fakultät von n, dh n! dh nx (n-1) x (n-2) x ... x 2 x 1

-- | Haskell comment goes like
-- | below 2 lines is code to calculate factorial and 3rd is it's execution  

factorial 0 = 1
factorial n = n * factorial (n - 1)
factorial 3

-- | for brevity let's call factorial as f; And x => y shows order execution left to right
-- | above executes as := f(3) as 3 x f(2) => f(2) as 2 x f(1) => f(1) as 1 x f(0) => f(0) as 1  
-- | 3 x (2 x (1 x (1)) = 6

Beachten Sie, dass Haskel das Überladen von Funktionen auf die Ebene des Argumentwerts zulässt. Im Folgenden finden Sie ein Beispiel für einen imperativen Code mit zunehmendem Grad an Imperativität:

//somewhat functional way
function factorial(n) {
  if(n < 1) {
     return 1;
  }
  return n * factorial(n-1);   
}
factorial(3);

//somewhat more imperative way
function imperativeFactor(n) {
  int f = 1
  for(int i = 1; i <= n; i++) {
     f = f * i
  }
  return f;
}

Diese Lektüre kann eine gute Referenz sein, um zu verstehen, wie sich zwingender Code mehr auf Teil, Zustand der Maschine (i in for-Schleife), Ausführungsreihenfolge und Flusskontrolle konzentriert.

Das spätere Beispiel kann grob als Java / C # Lang-Code und der erste Teil als Einschränkung der Sprache selbst im Gegensatz zu Haskell angesehen werden, um die Funktion um den Wert (Null) zu überladen, und kann daher gesagt werden, dass es sich andererseits nicht um eine puristische Funktionssprache handelt Hand kann man sagen, es unterstützt funktionale Prog. bis zu einem gewissen Grad.

Offenlegung: Keiner der oben genannten Codes wird getestet / ausgeführt, sollte aber hoffentlich gut genug sein, um das Konzept zu vermitteln. Ich würde mich auch über Kommentare für eine solche Korrektur freuen :)

alter Mönch
quelle
1
Sollte es nicht sein return n * factorial(n-1);?
Jinawee
@jinawee, danke für den Hinweis, ich habe es korrigiert vonn * (n-1)
alter Mönch
10

Die funktionale Programmierung ist eine Form der deklarativen Programmierung, die die Logik der Berechnung beschreibt und die Reihenfolge der Ausführung vollständig herabgesetzt wird.

Problem: Ich möchte diese Kreatur von einem Pferd in eine Giraffe verwandeln.

  • Hals verlängern
  • Beine verlängern
  • Flecken auftragen
  • Gib der Kreatur eine schwarze Zunge
  • Pferdeschwanz entfernen

Jeder Artikel kann in beliebiger Reihenfolge ausgeführt werden, um das gleiche Ergebnis zu erzielen.

Imperative Programmierung ist prozedural. Staat und Ordnung sind wichtig.

Problem: Ich möchte mein Auto parken.

  1. Beachten Sie den Ausgangszustand des Garagentors
  2. Halten Sie das Auto in der Einfahrt an
  3. Wenn das Garagentor geschlossen ist, öffnen Sie das Garagentor und merken Sie sich den neuen Zustand. Andernfalls fahren Sie fort
  4. Auto in die Garage ziehen
  5. Garagentor schließen

Jeder Schritt muss ausgeführt werden, um zum gewünschten Ergebnis zu gelangen. Das Einfahren in die Garage bei geschlossenem Garagentor würde zu einem kaputten Garagentor führen.

Jakub Keller
quelle
Ich sehe nur den Unterschied zwischen Async und Sync.
Vladimir Vukanac
@VladimirVukanac async / sync ist ein Mechanismus, keine Form der Programmierung
Jakub Keller
2
Oh, danke, ich werde mehr darüber recherchieren. Würden Sie so freundlich sein, Problem 1 so zu aktualisieren, dass es mit Problem 2 "Ich möchte mein Auto parken" identisch ist, aber in funktionaler Programmierweise geschrieben ist? Dann wird Parallelität ausgeschlossen.
Vladimir Vukanac
5

Funktionale Programmierung ist "Programmieren mit Funktionen", bei der eine Funktion einige erwartete mathematische Eigenschaften aufweist, einschließlich referenzieller Transparenz. Aus diesen Eigenschaften ergeben sich weitere Eigenschaften, insbesondere bekannte Argumentationsschritte, die durch Substituierbarkeit ermöglicht werden und zu mathematischen Beweisen führen (dh das Vertrauen in ein Ergebnis rechtfertigen).

Daraus folgt, dass ein Funktionsprogramm lediglich ein Ausdruck ist.

Sie können den Kontrast zwischen den beiden Stilen leicht erkennen, indem Sie die Stellen in einem Imperativprogramm notieren, an denen ein Ausdruck nicht mehr referenziell transparent ist (und daher nicht mit Funktionen und Werten erstellt wird und selbst nicht Teil einer Funktion sein kann). Die zwei offensichtlichsten Stellen sind: Mutation (z. B. Variablen) andere Nebenwirkungen nicht lokaler Kontrollfluss (z. B. Ausnahmen)

Auf diesem Rahmen von Programmen als Ausdrücken, die aus Funktionen und Werten bestehen, wird ein ganzes praktisches Paradigma von Sprachen, Konzepten, "Funktionsmustern", Kombinatoren und verschiedenen Typsystemen und Bewertungsalgorithmen aufgebaut.

Nach der extremsten Definition kann fast jede Sprache - sogar C oder Java - als funktional bezeichnet werden, aber normalerweise behalten sich die Leute den Begriff für Sprachen mit spezifisch relevanten Abstraktionen vor (wie Abschlüsse, unveränderliche Werte und syntaktische Hilfsmittel wie Mustervergleich). In Bezug auf die Verwendung der funktionalen Programmierung werden Funktionen verwendet und Code ohne Nebenwirkungen erstellt. verwendet, um Beweise zu schreiben

Romil pawar
quelle
3

Der imperative Programmierstil wurde in der Webentwicklung von 2005 bis 2013 praktiziert.

Mit der imperativen Programmierung haben wir Code geschrieben, der Schritt für Schritt genau auflistet, was unsere Anwendung tun soll.

Der funktionale Programmierstil erzeugt Abstraktion durch clevere Möglichkeiten, Funktionen zu kombinieren.

In den Antworten wird die deklarative Programmierung erwähnt, und dazu möchte ich sagen, dass die deklarative Programmierung einige Regeln auflistet, denen wir folgen müssen. Wir geben dann einen so genannten Anfangszustand für unsere Anwendung an und lassen diese Regeln das Verhalten der Anwendung definieren.

Nun, diese kurzen Beschreibungen machen wahrscheinlich nicht viel Sinn. Lassen Sie uns also die Unterschiede zwischen imperativer und deklarativer Programmierung durchgehen, indem wir eine Analogie durchgehen.

Stellen Sie sich vor, wir bauen keine Software, sondern backen Kuchen, um ihren Lebensunterhalt zu verdienen. Vielleicht sind wir schlechte Bäcker und wissen nicht, wie wir einen köstlichen Kuchen so backen sollen, wie wir sollten.

Also gibt uns unser Chef eine Liste mit Anweisungen, was wir als Rezept kennen.

Das Rezept sagt uns, wie man einen Kuchen macht. Ein Rezept ist in einem imperativen Stil wie folgt geschrieben:

  1. Mischen Sie 1 Tasse Mehl
  2. 1 Ei hinzufügen
  3. 1 Tasse Zucker hinzufügen
  4. Gießen Sie die Mischung in eine Pfanne
  5. Stellen Sie die Pfanne für 30 Minuten und 350 Grad F in den Ofen.

Das deklarative Rezept würde Folgendes bewirken:

1 Tasse Mehl, 1 Ei, 1 Tasse Zucker - Ausgangszustand

Regeln

  1. Wenn alles gemischt ist, in eine Pfanne geben.
  2. Wenn alles ungemischt ist, in eine Schüssel geben.
  3. Wenn alles in der Pfanne ist, in den Ofen geben.

Imperative Ansätze zeichnen sich also durch schrittweise Ansätze aus. Sie beginnen mit Schritt eins und fahren mit Schritt 2 fort und so weiter.

Sie erhalten schließlich ein Endprodukt. Wenn wir diesen Kuchen machen, nehmen wir diese Zutaten, mischen sie, legen sie in eine Pfanne und in den Ofen und Sie haben Ihr Endprodukt.

In einer deklarativen Welt ist es anders. Im deklarativen Rezept würden wir unser Rezept in zwei separate Teile aufteilen. Beginnen Sie mit einem Teil, der den Anfangszustand des Rezepts wie die Variablen auflistet. Unsere Variablen hier sind also die Mengen unserer Zutaten und ihre Art.

Wir nehmen den Ausgangszustand oder die Ausgangsbestandteile und wenden einige Regeln auf sie an.

Also nehmen wir den Ausgangszustand und durchlaufen diese Regeln immer wieder, bis wir einen essfertigen Rhabarber-Erdbeerkuchen oder was auch immer bekommen.

In einem deklarativen Ansatz müssen wir also wissen, wie diese Regeln richtig strukturiert werden.

Die Regeln, nach denen wir unsere Zutaten untersuchen oder angeben möchten, wenn sie gemischt sind, legen Sie sie in eine Pfanne.

Bei unserem Ausgangszustand stimmt das nicht überein, da wir unsere Zutaten noch nicht gemischt haben.

Regel 2 besagt also, wenn sie nicht gemischt sind, mischen Sie sie in einer Schüssel. Okay, ja, diese Regel gilt.

Jetzt haben wir eine Schüssel mit gemischten Zutaten als unseren Zustand.

Jetzt wenden wir diesen neuen Zustand wieder auf unsere Regeln an.

Regel 1 besagt also, wenn Zutaten gemischt sind, lege sie in eine Pfanne. Okay, jetzt gilt Regel 1, lass es uns tun.

Jetzt haben wir diesen neuen Zustand, in dem die Zutaten gemischt und in einer Pfanne sind. Regel 1 ist nicht mehr relevant, Regel 2 gilt nicht.

Regel 3 besagt, wenn sich die Zutaten in einer Pfanne befinden, legen Sie sie in den Ofen. Gut, dass diese Regel für diesen neuen Zustand gilt. Lassen Sie es uns tun.

Und am Ende haben wir einen köstlichen heißen Apfelkuchen oder was auch immer.

Wenn Sie wie ich sind, denken Sie vielleicht, warum wir nicht immer noch imperative Programmierung durchführen. Das macht Sinn.

Nun, für einfache Abläufe ja, aber die meisten Webanwendungen haben komplexere Abläufe, die vom imperativen Programmierdesign nicht richtig erfasst werden können.

In einem deklarativen Ansatz können wir einige Anfangsbestandteile oder einen Anfangszustand wie textInput=“”eine einzelne Variable haben.

Möglicherweise beginnt die Texteingabe als leere Zeichenfolge.

Wir nehmen diesen Ausgangszustand und wenden ihn auf eine Reihe von Regeln an, die in Ihrer Anwendung definiert sind.

  1. Wenn ein Benutzer Text eingibt, aktualisieren Sie die Texteingabe. Nun, im Moment trifft das nicht zu.

  2. Wenn eine Vorlage gerendert wird, berechnen Sie das Widget.

  3. Wenn textInput aktualisiert wird, rendern Sie die Vorlage erneut.

Nun, nichts davon trifft zu, so dass das Programm nur darauf wartet, dass ein Ereignis eintritt.

Irgendwann aktualisiert ein Benutzer die Texteingabe und dann wenden wir möglicherweise Regel Nummer 1 an.

Wir können das auf aktualisieren “abcd”

Also haben wir gerade unsere Text- und Texteingabe-Aktualisierungen aktualisiert, Regel Nr. 2 gilt nicht, Regel Nr. 3 sagt, wenn die Texteingabe aktualisiert wurde, was gerade stattgefunden hat, dann rendern wir die Vorlage erneut und kehren dann zu Regel 2 zurück, die besagt, ob die Vorlage gerendert wird , berechne das Widget, okay, lass uns das Widget berechnen.

Im Allgemeinen möchten wir als Programmierer nach deklarativeren Programmierentwürfen streben.

Der Imperativ scheint klarer und offensichtlicher zu sein, aber ein deklarativer Ansatz lässt sich für größere Anwendungen sehr gut skalieren.

Daniel
quelle
2

• Imperative Sprachen:

  • Effiziente Ausführung

  • Komplexe Semantik

  • Komplexe Syntax

  • Parallelität ist vom Programmierer entworfen

  • Komplexe Tests haben keine referenzielle Transparenz und Nebenwirkungen

  • Hat Zustand

• Funktionssprachen:

  • Einfache Semantik

  • Einfache Syntax

  • Weniger effiziente Ausführung

  • Programme können automatisch gleichzeitig erstellt werden

  • Einfaches Testen, referenzielle Transparenz, keine Nebenwirkungen

  • Hat keinen Zustand
BoraKurucu
quelle
1

Ich denke, es ist möglich, funktionale Programmierung zwingend auszudrücken:

  • Mit viel Statusprüfung von Objekten und if... else/ oder switchAnweisungen
  • Einige Timeout- / Wartemechanismen, um Asynchronität zu beseitigen

Es gibt große Probleme mit einem solchen Ansatz:

  • Regeln / Verfahren werden wiederholt
  • Statefulness lässt Chancen für Nebenwirkungen / Fehler

Die funktionale Programmierung, die Behandlung von Funktionen / Methoden wie Objekte und die Akzeptanz von Staatenlosigkeit, wurde geboren, um die Probleme zu lösen, von denen ich glaube.

Anwendungsbeispiel: Frontend-Anwendungen wie Android, iOS oder die Logik von Webanwendungen inkl. Kommunikation mit dem Backend.

Weitere Herausforderungen bei der Simulation der funktionalen Programmierung mit imperativem / prozeduralem Code:

  • Rennbedingung
  • Komplexe Kombination und Abfolge von Ereignissen. Beispielsweise versucht der Benutzer, Geld in einer Banking-App zu senden. Schritt 1) ​​Führen Sie alle folgenden Schritte parallel aus. Fahren Sie nur fort, wenn alles in Ordnung ist. A) Überprüfen Sie, ob der Benutzer noch gut ist (Betrug, Geldwäsche). B) Überprüfen Sie, ob der Benutzer über ein ausreichendes Guthaben verfügt. C) Überprüfen Sie, ob der Empfänger gültig und gut ist (Betrug, AML) usw. Schritt 2) Führen Sie den Übertragungsvorgang aus. Schritt 3) Zeigen Sie die Aktualisierung des Guthabens des Benutzers und / oder eine Art Tracking an. Bei RxJava zum Beispiel ist der Code präzise und sinnvoll. Ohne sie kann ich mir vorstellen, dass es viel Code, chaotischen und fehleranfälligen Code geben würde

Ich glaube auch, dass der Funktionscode am Ende des Tages in Baugruppen- oder Maschinencode übersetzt wird, der von den Compilern zwingend / prozedural ist. Wenn Sie jedoch keine Assembly schreiben, ist die funktionale Programmierung für Menschen, die Code mit einer für Menschen lesbaren Sprache auf hoher Ebene schreiben, die geeignetere Ausdrucksweise für die aufgeführten Szenarien

ericn
quelle
-1

Ich weiß, dass diese Frage älter ist und andere sie bereits gut erklärt haben. Ich möchte ein Beispielproblem nennen, das dasselbe in einfachen Worten erklärt.

Problem: Schreiben der 1-Tabelle.

Lösung: -

Nach imperativem Stil: =>

    1*1=1
    1*2=2
    1*3=3
    .
    .
    .
    1*n=n 

Nach Funktionsstil: =>

    1
    2
    3
    .
    .
    .
    n

Erklärung im imperativen Stil schreiben wir die Anweisungen expliziter und können vereinfacht aufgerufen werden.

Wo wie im funktionalen Stil Dinge, die selbsterklärend sind, ignoriert werden.

Param NC
quelle