Welche funktionalen Sprachtechniken können in Imperativsprachen verwendet werden?

7

Welche Techniken oder Paradigmen, die normalerweise mit funktionalen Sprachen assoziiert werden, können auch in Imperativsprachen produktiv eingesetzt werden?

z.B.:

  • Rekursion kann in Sprachen ohne Tail-Call-Optimierung problematisch sein und ihre Verwendung auf eine begrenzte Anzahl von Fällen beschränken, was von begrenztem Nutzen ist
  • Karte und Filter haben ihren Weg in nicht-funktionale Sprachen gefunden, obwohl sie eine funktionale Art von Gefühl für sie haben

Ich mag wirklich, dass ich mich in funktionalen Sprachen nicht um den Staat kümmern muss. Wenn ich besonders hartnäckig wäre, könnte ich C-Programme schreiben, ohne Variablen zu verändern. Ich kapsle nur meinen Zustand in Variablen ein, die an Funktionen übergeben werden, und an Werten, die von Funktionen zurückgegeben werden.

Obwohl Funktionen keine Werte erster Klasse sind, kann ich einen in ein Objekt in Java einbinden und diesen in eine andere Methode übergeben. Wie funktionale Programmierung, nur weniger Spaß.

Also, für Veteranen der funktionalen Programmierung, wenn Sie in imperativen Sprachen programmieren, welche Ideen von FP haben Sie erfolgreich angewendet?

    
Rob Lachlan 25.02.2009, 02:19
quelle

5 Antworten

11

Schön fast alle?

Wenn Sie funktionale Sprachen verstehen, können Sie imperative Programme schreiben, die von einem funktionalen Stil "informiert" sind. Das führt Sie weg von Nebenwirkungen und zu Programmen, in denen das Lesen des Programmtextes an einem bestimmten Punkt ausreicht, um Sie wirklich wissen zu lassen, was die Bedeutung des Programms zu diesem Zeitpunkt ist.

Im Morgengrauen der Zeit machten wir uns Sorgen um "Kopplung" und "Zusammenhalt". Das Erlernen eines FPs wird Sie dazu bringen, Systeme mit optimaler (minimaler) Kopplung und hoher Kohäsion zu schreiben.

    
Charlie Martin 25.02.2009, 02:43
quelle
6

Hier sind Dinge, die FP in einer Nicht-FP-Sprache behindern:

  • Wenn die Sprache lambda / closures nicht unterstützt und keinen syntaktischen Zucker enthält, um sie einfach zu hacken, sind Sie tot im Wasser. Sie rufen map / filter nicht ohne Closures auf.
  • Wenn die Sprache statisch typisiert ist und Generika nicht unterstützt, sind Sie tot im Wasser. Alle guten FP-Sachen verwenden Generizität.
  • Wenn die Sprache tail-recursion nicht unterstützt, sind Sie behindert. Sie können Implementierungen von z.B. 'map' iterativ; Oft sind Ihre Daten auch nicht zu groß und die Rekursion ist in Ordnung.
  • Wenn die Sprache algebraische Datentypen und Mustervergleiche nicht unterstützt, werden Sie leicht behindert. Es ist einfach ärgerlich, sie nicht zu haben, wenn du sie einmal probiert hast.
  • Wenn die Sprache keine Typklassen ausdrücken kann, naja, naja ... Sie werden durchkommen, aber verdammt, wenn das nicht nur die tollste Funktion aller Zeiten ist, aber Haskell ist die einzige weit verbreitete Sprache mit guter Unterstützung.
Brian 25.02.2009 05:04
quelle
3

Wenn Sie keine erstklassigen Funktionen haben, wird das Schreiben funktionaler Programme beeinträchtigt, aber es gibt einige Dinge, die Sie nicht tun müssen. Der erste besteht darin, den veränderbaren Zustand zu vermeiden - versuchen Sie, dass die meisten oder alle Ihrer Klassen neue Objekte zurückgeben, die den geänderten Zustand darstellen, anstatt die Änderung intern vorzunehmen. Wenn Sie beispielsweise eine verknüpfte Liste mit einer add -Operation schreiben, möchten Sie die neue verknüpfte Liste von add zurückgeben, anstatt das Objekt zu ändern.

Während dies Ihre Programme weniger effizient macht (aufgrund der erhöhten Anzahl von Objekten, die erstellt und zerstört werden), können Sie das Programm leichter debuggen, weil der Zustand und die Operation der Objekte vorhersagbarer werden, ganz zu schweigen davon die Möglichkeit, Funktionsaufrufe tiefer zu verschachteln, da sie über Statuseingänge und -ausgaben verfügen.

    
Kyle Cronin 25.02.2009 02:48
quelle
3

Ich habe erfolgreich höherwertige Funktionen verwendet, insbesondere die Art, die übergeben wird, anstatt die Art, die zurückgegeben wird. Die Art, die zurückgegeben wird, kann ein wenig mühsam sein, kann aber simuliert werden.

In imperativen Sprachen funktionieren alle Arten von anwendbaren Datenstrukturen und rekursiven Funktionen.

Die Dinge, die ich am meisten vermisse:

  • Fast keine imperative Sprachen garantieren, jeden Tail Call zu optimieren.

  • Ich kenne keine imperative Sprache, die Fallanalyse durch Mustervergleich unterstützt.

Norman Ramsey 26.02.2009 03:42
quelle
0

Ich weiß, dass das eine alte Frage ist, aber Antworten mit Beispielen können in diesem Video auf infoQ gesehen werden in etwas Tiefe hinein.

    
klausnrooster 17.01.2012 04:12
quelle