Argumente für die funktionale Programmierung [geschlossen]

10

Ich habe kürzlich zum Spaß F # gelernt (ich bin ein VB.NET/C# -Entwickler) und ich mag einige der Angebote wirklich. Theoretisch ist das so. Aber ich habe Probleme, mir Szenarien auszudenken, in denen ich lieber in F # als in C # codieren würde. Irgendwelche Ideen?

System ausgefallen
quelle
2
F#ist nicht vollständig repräsentativ für die funktionale Programmierung. Versuchen Sie es Clojurestattdessen.
Job
1
Ich kenne F # nicht, aber ich benutze Haskell, wann immer ich will. Arbeitete bisher jedes Mal;)
1
infoq.com/presentations/Are-We-There-Yet-Rich-Hickey ist ein großartiges Video zu diesem Thema (OO vs. Functional)
mikera
Eine dynamische funktionale Sprache? Sie können so viele haben, wie Sie möchten. : P
Erik Reppen

Antworten:

6

Ich habe Probleme, mir Szenarien auszudenken, in denen ich lieber in F # als in C # codieren würde. Irgendwelche Ideen?

Von hier aus :

Asynchrone Server

  • Asynchrone Workflows für die asynchrone E / A.
  • Postfachprozessor für die thread-sichere Nachrichtenübermittlung.
  • Unionstypen für Serverstatus und Nachrichtenkatalog.
  • Pattern Matching und Tail Rekursion für die Zustandsautomaten.

Metaprogrammierung (zB Parsing)

  • Parser-Generatoren wie fslex und fsyacc.
  • Parser-Kombinatoren wie FParsec.
  • Aktive Muster für elegante handgerollte Parser.
  • Algebraische Datentypen zur Darstellung von Analysebäumen.
  • Mustervergleich zum Bearbeiten von Bäumen, z. B. Anwenden von Optimierungsstufen.
  • Reflexion zur Laufzeitgenerierung von schnellem Code.

Technisches Rechnen

  • Funktionen höherer Ordnung für eleganten und schnellen algorithmischen Code.
  • Algebraische Datentypen und Mustervergleich zur symbolischen Manipulation.
  • Interoperabilität für eine Vielzahl von .NET-Bibliotheken.
  • Interaktivität mit F # interaktiv.
  • Berechnungsausdrücke zum Massieren von Daten.
  • Maßeinheiten für verbesserte Korrektheit.

GUI-Anwendungen

  • Modell als asynchrone Nachricht, die zwischen Benutzeroberflächencode und Anwendungslogikcode übertragen wird.
  • Mit Funktionen höherer Ordnung können Sie Benutzeroberflächen deklarativ definieren.

Logikprogrammierung

  • Permanente Sammlungen für einfaches Backtracking.
  • Schwanz verlangt nach Zuverlässigkeit.
  • Automatische Generalisierung für einfache generische Programmierung.

Testen

  • Führen Sie Unit-Tests interaktiv durch.
  • BDD bedeutet, einen Dolmetscher zu schreiben.
  • Gute Skriptsprache zum Schreiben von Testgeschirren und zum Visualisieren von Ergebnissen.

Performance

  • inline für eine kostenlose Abstraktion höherer Ordnung.
  • Tail fordert schnelle Zustandsautomaten.
  • Rein funktionale Datenstrukturen für geringe Latenz.
  • Metaprogrammierung zur Generierung von optimiertem Code.
Jon Harrop
quelle
Ich gebe zu, dass ich F # oder C # nicht kenne, aber ich würde vorschlagen, ein paar Tage in F # zu verbringen und zu sehen, was Sie denken. Meiner Meinung nach ist die Verwendung der REPL ein großer Gewinn in jeder Sprache, die sie unterstützt
Zachary K
5

Hier ist, wofür die Programmierung mit funktionalem Stil verwendet wird - mehr oder weniger täglich.

Wir machen viele statistische und versicherungsmathematische Dinge mit ziemlich großen Datenmengen. Die aus der Datenbank abgerufenen Daten sind - im Wesentlichen statische, unveränderliche Objekte. Kein Grund, eine Klasse mit Methoden zu erstellen.

In jeder Phase der Berechnung werden einige zusätzliche Details hinzugefügt, das Objekt wird jedoch nicht wesentlich mutiert. Am "Ende" der Pipeline machen wir wirklich eine ausgefallene Reduzierung, um Summen und Zählungen und andere Dinge zu berechnen.

Stell dir das vor.

for data in summarize( enrich( calculate( some_query( criteria() ) ) ) ):
    print data

Jede "Phase" der Berechnung ist eine funktionale Programmierschleife, die eine einfache Lese-Berechnungs-Ausbeute ausführt und ein zusammengesetztes Objekt aus anderen Dingen und Ergebnissen erstellt.

(Wir verwenden Python, daher die funktionale Programmierung mit Generatorfunktionen.)

Es ist einfacher, zustandslose, unveränderliche Objekte zu verwenden.

S.Lott
quelle
Hat Python ein Äquivalent zu diesem F #? criteria() |> some_query |> calculate |> enrich |> summarizeIch finde, dass der Vorwärtsrohrbetreiber zu klarerem Code führen kann, aber ich schweife ab.
ChaosPandion
@ChaosPandion: Erstens verwirrt mich diese Syntax. Aber manche Leute scheinen es zu mögen. Es gibt unzählige Python-Pakete. Ich bin sicher, dass Sie auf SO danach suchen und eine Antwort finden könnten.
S.Lott
@Chaos: Nicht das ich wüsste. Normalerweise komponiere ich, mapum den gleichen Effekt zu erzielen.
Paul Nathan
4

Technisch gesehen ist es keine eindeutige Eigenschaft einer funktionalen Programmierung, und F # ist keine reine funktionale Sprache. F # bietet als einer der ML-Nachkommen einen hervorragenden Mustervergleich und algebraische Datentypen. Für jede Aufgabe, die komplexe Datenstrukturen erfordert, ist F # viel aussagekräftiger und benutzerfreundlicher als C #.

Stellen Sie sich vor, Sie implementieren einen Compiler in C # und F # - er stellt einen abstrakten Syntaxbaum dar und transformiert ihn. Dies ist viel einfacher, wenn Ihre Sprache ADTs und einen Mustervergleich bereitstellt.

SK-Logik
quelle
2

Ideal für kartenreduzierte massive Multisystem- und massive Multi-Core-Parallelität. Ziemlich cool, wenn man bedenkt, dass Einstiegsserver heutzutage mit 48 Kernen (96 mit HT) ausgestattet sind.

vartec
quelle
2

Wenn Sie voll funktionsfähig sein möchten, probieren Sie Haskell, Erlang hat auch einige sehr coole Sachen.

Simon Payton-Jones sagte über Haskell, er wolle ein Programm haben, das offensichtlich keine Fehler enthält, anstatt keine offensichtlichen Fehler zu haben.

(Ich habe das Zitat wahrscheinlich etwas falsch verstanden, aber Sie haben die Idee)

Indem Sie Nebenwirkungen einschränken, können Sie die Richtigkeit Ihres Codes viel einfacher nachweisen.

Zachary K.
quelle
1

Ein klarer Vorteil ist, dass es viel einfacher parallelisiert werden kann.

biziclop
quelle
2
Sie sprechen von Reinheit und ein offensichtlicher Nachteil ist, dass Reinheit dazu neigt, Programme viel langsamer zu machen. Parallel + rein ist also nicht unbedingt eine gute Sache.
Jon Harrop