Frage

In meinem zweiten Jahr an der Universität wurde uns Haskell „beigebracht“, ich weiß fast nichts darüber und noch weniger über funktionale Programmierung.

Was ist funktionale Programmierung, warum und/oder wo sollte ich sie anstelle von nicht-funktionaler Programmierung verwenden und habe ich Recht, wenn ich denke, dass C eine nicht-funktionale Programmiersprache ist?

War es hilfreich?

Lösung

Ein Schlüsselmerkmal einer funktionalen Sprache ist das Konzept erstklassiger Funktionen.Die Idee ist, dass Sie Funktionen als Parameter an andere Funktionen übergeben und diese als Werte zurückgeben können.

Bei der funktionalen Programmierung geht es darum, Code zu schreiben, der seinen Zustand nicht ändert.Der Hauptgrund hierfür besteht darin, dass aufeinanderfolgende Aufrufe einer Funktion zum gleichen Ergebnis führen.Sie können Funktionscode in jeder Sprache schreiben, die erstklassige Funktionen unterstützt. Es gibt jedoch Sprachen wie Haskell, in denen Sie den Status nicht ändern können.Tatsächlich sollten Sie überhaupt keine Nebenwirkungen haben (wie das Ausdrucken von Text) – was sich anhört, als wäre es völlig nutzlos.

Haskell verwendet stattdessen einen anderen Ansatz für IO:Monaden.Hierbei handelt es sich um Objekte, die die gewünschte E/A-Operation enthalten, die von der obersten Ebene Ihres Interpreters ausgeführt werden soll.Auf jeder anderen Ebene sind sie einfach Objekte im System.

Welche Vorteile bietet die funktionale Programmierung?Die funktionale Programmierung ermöglicht eine Codierung mit weniger Fehlerpotenzial, da jede Komponente vollständig isoliert ist.Darüber hinaus ermöglicht die Verwendung von Rekursion und erstklassigen Funktionen einfache Korrektheitsnachweise, die typischerweise die Struktur des Codes widerspiegeln.

Andere Tipps

Was ist funktionale Programmierung?

Heutzutage werden zwei unterschiedliche Definitionen von „funktionaler Programmierung“ gebräuchlich:

Die ältere Definition (die von Lisp stammt) besagt, dass es bei der funktionalen Programmierung um die Programmierung mit erstklassigen Funktionen geht, d. h.Dabei werden Funktionen wie jeder andere Wert behandelt, sodass Sie Funktionen als Argumente an andere Funktionen übergeben können und Funktionen Funktionen unter ihren Rückgabewerten zurückgeben können.Dies gipfelt in der Verwendung von Funktionen höherer Ordnung wie z map Und reduce (Sie haben vielleicht schon davon gehört mapReduce als einzelne Operation, die von Google häufig verwendet wird und, was nicht überraschend ist, ein enger Verwandter ist!).Die .NET-Typen System.Func Und System.Action Stellen Sie Funktionen höherer Ordnung in C# zur Verfügung.Obwohl Currying in C# unpraktisch ist, sind Funktionen üblich, die andere Funktionen als Argumente akzeptieren, z. B.Die Parallel.For Funktion.

Die jüngere Definition (populär gemacht durch Haskell) besagt, dass es bei der funktionalen Programmierung auch um die Minimierung und Kontrolle von Nebenwirkungen einschließlich Mutationen geht, d. h.Schreiben von Programmen, die Probleme durch das Verfassen von Ausdrücken lösen.Dies wird häufiger als „rein funktionale Programmierung“ bezeichnet.Möglich wird dies durch völlig unterschiedliche Ansätze für Datenstrukturen, die als „rein funktionale Datenstrukturen“ bezeichnet werden.Ein Problem besteht darin, dass die Übersetzung herkömmlicher imperativer Algorithmen zur Verwendung rein funktionaler Datenstrukturen die Leistung typischerweise um das Zehnfache verschlechtert.Haskell ist die einzige überlebende rein funktionale Programmiersprache, aber die Konzepte haben sich mit Bibliotheken wie in die Mainstream-Programmierung eingeschlichen Linq im Netz.

Wo würde ich es anstelle einer nicht-funktionalen Programmierung verwenden wollen?

Überall.Lambdas in C# haben mittlerweile große Vorteile gezeigt.C++11 hat Lambdas.Es gibt keine Entschuldigung, jetzt keine Funktionen höherer Ordnung zu verwenden.Wenn Sie eine Sprache wie F# verwenden können, profitieren Sie auch von Typinferenz, automatischer Generalisierung, Currying und teilweiser Anwendung (sowie vielen anderen Sprachfunktionen!).

Liege ich richtig, wenn ich denke, dass C eine nicht funktionale Programmiersprache ist?

Ja.C ist eine prozedurale Sprache.Sie können jedoch einige Vorteile der funktionalen Programmierung nutzen, indem Sie Funktionszeiger und verwenden void * in C.

Es könnte sich lohnen, diesen Artikel zu lesen F# „101“ auf CoDe Mag kürzlich gepostet.

Auch, Dustin Campbell hat einen tollen Blog Dort hat er viele Artikel über seine Abenteuer veröffentlicht, wie er sich mit F# vertraut machen kann.

Ich hoffe, Sie finden diese nützlich :)

BEARBEITEN:

Um nur hinzuzufügen, mein Verständnis von funktionaler Programmierung ist Folgendes alles ist eine Funktion oder Parameter einer Funktion und keine Instanzen/zustandsbehafteten Objekte.Aber ich könnte mich irren. F# ist etwas, mit dem ich unbedingt anfangen möchte, aber ich habe einfach keine Zeit!:) :)

Der Beispielcode von John the Statistician zeigt keine funktionale Programmierung, da der Schlüssel bei der funktionalen Programmierung darin besteht, dass der Code KEINE ZUWEISUNGEN ausführt ( record = thingConstructor(t) ist eine Aufgabe) und hat KEINE NEBENWIRKUNGEN (localMap.put(record) ist eine Aussage mit Nebenwirkung).Aufgrund dieser beiden Einschränkungen ist alles, was a Funktion wird durch seine Argumente und seinen Rückgabewert vollständig erfasst.Schreiben Sie den Code des Statistikers so um, wie er aussehen müsste, wenn Sie eine funktionale Sprache mit C++ emulieren möchten:

RT getOrCreate(const T thing, 
                  const Function<RT<T>> thingConstructor, 
                  const Map<T,RT<T>> localMap) {
    return localMap.contains(t) ?
        localMap.get(t) :
        localMap.put(t,thingConstructor(t));
}

Aufgrund der No-Side-Effects-Regel ist jede Anweisung Teil des Rückgabewerts (daher return kommt Erste), und jede Aussage ist ein Ausdruck.In Sprachen, die funktionale Programmierung erzwingen, ist die return Schlüsselwort ist impliziert, und das Wenn Die Anweisung verhält sich wie die von C++ ?: Operator.

Außerdem ist alles unveränderlich, also localMap.put muss eine neue Kopie von erstellen lokaleKarte und geben Sie es zurück, anstatt das Original zu ändern lokaleKarte, wie es ein normales C++- oder Java-Programm tun würde.Abhängig von der Struktur von localMap könnte die Kopie Zeiger auf das Original wiederverwenden und so die Menge der zu kopierenden Daten reduzieren.

Zu den Vorteilen der funktionalen Programmierung gehört die Tatsache, dass funktionale Programme kürzer sind und es einfacher ist, ein funktionales Programm zu ändern (da keine versteckten globalen Effekte zu berücksichtigen sind) und es einfacher ist, das Programm direkt in das Programm zu integrieren erster Platz.

Funktionale Programme laufen jedoch tendenziell langsam (aufgrund der vielen Kopiervorgänge, die sie ausführen müssen) und interagieren nicht gut mit anderen Programmen, Betriebssystemprozessen oder Betriebssystemen, die Speicheradressen (Little-Endian) verarbeiten Byteblöcke und andere maschinenspezifische, nicht funktionale Bits.Der Grad der Nichtinteroperabilität korreliert tendenziell umgekehrt mit dem Grad der funktionalen Reinheit und der Strenge des Typsystems.

Die populäreren funktionalen Sprachen haben wirklich sehr strenge Typsysteme.In OCAML können Sie nicht einmal Ganzzahl- und Gleitkomma-Mathematik mischen oder dieselben Operatoren verwenden (+ dient zum Addieren von Ganzzahlen, +.dient zum Hinzufügen von Floats).Dies kann entweder ein Vorteil oder ein Nachteil sein, je nachdem, wie hoch Sie die Fähigkeit eines Typprüfers schätzen, bestimmte Arten von Fehlern zu erkennen.

Funktionale Sprachen verfügen in der Regel auch über sehr große Laufzeitumgebungen.Haskell ist eine Ausnahme (ausführbare GHC-Dateien sind fast so klein wie C-Programme, sowohl zur Kompilierungszeit als auch zur Laufzeit), aber SML-, Common Lisp- und Scheme-Programme benötigen immer jede Menge Speicher.

Ja, Sie haben Recht, wenn Sie denken, dass C eine nicht funktionale Sprache ist.C ist eine prozedurale Sprache.

Ich bevorzuge die funktionale Programmierung, um mir wiederholte Arbeit zu ersparen, indem ich eine abstraktere Version erstelle und diese dann stattdessen verwende.Lassen Sie mich ein Beispiel geben.In Java erstelle ich häufig Karten zum Aufzeichnen von Strukturen und schreibe daher getOrCreate-Strukturen.

SomeKindOfRecord<T> getOrCreate(T thing) { 
    if(localMap.contains(t)) { return localMap.get(t); }
    SomeKindOfRecord<T> record = new SomeKindOfRecord<T>(t);
    localMap = localMap.put(t,record);
    return record; 
}

Das passiert sehr oft.Jetzt konnte ich in einer funktionalen Sprache schreiben

RT<T> getOrCreate(T thing, 
                  Function<RT<T>> thingConstructor, 
                  Map<T,RT<T>> localMap) {
    if(localMap.contains(t)) { return localMap.get(t); }
    RT<T> record = thingConstructor(t);
    localMap = localMap.put(t,record);
    return record; 
}

und ich müsste nie wieder ein neues davon schreiben, ich könnte es erben.Aber ich könnte es besser machen als das Vererben, könnte ich im Konstruktor dieser Sache sagen

getOrCreate = myLib.getOrCreate(*,
                                SomeKindOfRecord<T>.constructor(<T>), 
                                localMap);

(wobei * eine Art „Diesen Parameter offen lassen“-Notation ist, was eine Art Curry ist)

und dann ist das lokale getOrCreate genau dasselbe, wie es gewesen wäre, wenn ich das Ganze in einer Zeile geschrieben hätte, ohne Vererbungsabhängigkeiten.

Wenn Sie nach einem guten Text zu F# suchen

Experte F# wird von Don Syme mitgeschrieben.Schöpfer von F#.Er arbeitete speziell an Generika in .NET, um F# erstellen zu können.

F# ist OCaml nachempfunden, daher würde Ihnen jeder OCaml-Text auch beim Erlernen von F# helfen.

ich finde Was ist funktionale Programmierung? um nützlich zu sein

Bei funktionaler Programmierung geht es darum, reine Funktionen zu schreiben, versteckte Eingänge und Ausgänge so weit wie möglich zu entfernen, so dass so viel wie möglich wie möglich eine Beziehung zwischen Eingängen und Ausgaben beschreibt.

Bevorzugen Sie explizit when param

public Program getProgramAt(TVGuide guide, int channel, Date when) {
  Schedule schedule = guide.getSchedule(channel);

  Program program = schedule.programAt(when);

  return program;
}

über

public Program getCurrentProgram(TVGuide guide, int channel) {
  Schedule schedule = guide.getSchedule(channel);

  Program current = schedule.programAt(new Date());

  return current;
}

Eine funktionale Sprache ist aktiv feindlich gegenüber Nebenwirkungen.Nebenwirkungen sind Komplexität und Komplexität sind Fehler, und Fehler sind der Teufel.Eine funktionale Sprache wird Ihnen auch dabei helfen, feindselig gegenüber Nebenwirkungen zu sein.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top