Ist das Curryning dasselbe wie das Überladen?

7

Ist Currieren für die funktionale Programmierung dasselbe wie Überladen für die OO-Programmierung? Wenn nicht, warum? (mit Beispielen wenn möglich)

Tks

    
Marcelo de Aguiar 16.05.2012, 00:42
quelle

3 Antworten

10

Das Currieren ist nicht spezifisch für die funktionale Programmierung, und das Überladen ist nicht spezifisch für die objektorientierte Programmierung.

"Currying" ist die Verwendung von Funktionen, denen Sie weniger Argumente übergeben können als erforderlich, um eine Funktion der verbleibenden Argumente zu erhalten. dh wenn wir eine Funktion plus haben, die zwei ganzzahlige Argumente akzeptiert und ihre Summe zurückgibt, dann können wir das einzige Argument 1 an plus übergeben und das Ergebnis ist eine Funktion zum Hinzufügen von 1 zu Dinge.

In haskellischer Syntax (mit Funktionsanwendung durch Adjazenz):

%Vor%

In vage Cish-Syntax (mit Funktionsanwendung in Klammern):

%Vor%

Sie können in beiden Beispielen sehen, dass plusCurried nur für 1 Argument aufgerufen wird, und das Ergebnis ist etwas, das an eine Variable gebunden und dann für ein anderes Argument aufgerufen werden kann. Der Grund dafür, dass Sie sich als funktionales Programmierungskonzept vorstellen, ist, dass es am meisten in funktionalen Sprachen verwendet wird, deren Syntax durch Adjazenz angewendet wird, da in dieser Syntax das Currying sehr natürlich wird. Die Anwendungen von plusCurried und plusUncurried , um four und five in der Haskellish-Syntax zu definieren, verschmelzen, um völlig ununterscheidbar zu werden. Sie können also einfach alle Funktionen vollständig curieren lassen (dh jede Funktion muss genau funktionieren) ein Argument, nur einige von ihnen werden andere Funktionen zurückgeben, die dann auf weitere Argumente angewendet werden können). Während die Definitionen von four und five in der Cish-Syntax bei der Anwendung durch Klammerlisten-Argumente völlig anders aussehen, müssen Sie zwischen plusCurried und plusUncurried unterscheiden. Auch die Imperativsprachen, die zu den heutigen objektorientierten Sprachen (und einigen der heutigen objektorientierten Sprachen) führten, hatten niemals die Fähigkeit, Funktionen an Variablen zu binden oder sie an andere Funktionen zu übergeben (dies ist bekannt als erstklassige Funktionen), und Ohne diese Möglichkeit gibt es nichts, was Sie tatsächlich mit einer Curry-Funktion tun tun können, außer sie bei allen Argumenten aufzurufen, und daher ist es auch nicht sinnvoll, sie zu haben.

Der Begriff currying bezieht sich auch auf den Prozess der Umwandlung einer Funktion von mehreren Argumenten in einen, der ein einzelnes Argument annimmt und eine andere Funktion (die ein einzelnes Argument zurückgibt und eine andere Funktion zurückgibt ...) und "uncurrying" zurückgibt "kann sich auf den Vorgang der umgekehrten Konvertierung beziehen.

Überladen ist ein völlig unzusammenhängendes Konzept. Das Überladen eines Namens bedeutet, dass mehrere Definitionen mit unterschiedlichen Eigenschaften (Argumenttypen, Anzahl der Argumente, Rückgabetyp usw.) angegeben werden und der Compiler die Definition einer bestimmten Darstellung des Namens durch den Kontext, in dem er angezeigt wird, auflöst. p>

Ein ziemlich naheliegendes Beispiel hierfür ist, dass wir plus definieren können, um Ganzzahlen hinzuzufügen, aber auch den Namen plus für das Hinzufügen von Fließkommazahlen verwenden, und wir könnten es möglicherweise für die Verkettung von Strings, Arrays, Listen verwenden. usw., oder um Vektoren oder Matrizen hinzuzufügen. All diese haben sehr unterschiedliche Implementierungen, die in Bezug auf die Implementierung der Sprache nichts miteinander zu tun haben, aber wir haben ihnen zufällig den gleichen Namen gegeben. Der Compiler ist dann dafür verantwortlich, herauszufinden, dass plus stringA stringB die Zeichenkette plus aufrufen (und eine Zeichenkette zurückgeben soll), während plus intX intY die Ganzzahl plus (und eine ganze Zahl zurückgeben soll) aufrufen soll.

Auch hier gibt es keinen Grund, warum dieses Konzept eher ein "OO-Konzept" als ein funktionales Programmierkonzept ist. Es passierte einfach, dass es ganz natürlich in statisch typisierte objektorientierte Sprachen passte, die entwickelt wurden; Wenn Sie bereits auflösen, welche Methode von dem Objekt aufgerufen wird, für das die Methode aufgerufen wird, ist es eine kleine Erweiterung, um eine allgemeinere Überladung zuzulassen. Vollständiges Ad-hoc-Überladen (wo Sie nichts anderes tun, als denselben Namen mehrmals zu definieren und dem Compiler zu vertrauen, dass es funktioniert), passt nicht so gut in Sprachen mit erstklassigen Funktionen, denn wenn Sie den überladenen Namen als a übergeben Funktion selbst haben Sie nicht den aufrufenden Kontext, um Ihnen zu helfen herauszufinden, welche Definition beabsichtigt ist (und Programmierer können verwirrt werden, wenn das, was sie wirklich wollten, alle die überladenen Definitionen übergibt). Haskell entwickelte Typklassen als eine prinzipielle Art der Verwendung von Überladung; Diese effektiv tun ermöglichen es Ihnen, alle überladenen Definitionen gleichzeitig zu übergeben und dem Typsystem zu erlauben, Typen wie "jeden Typ, für den die Funktionen f und g definiert sind" auszudrücken. .

Zusammenfassend:

  • currying und overloading sind völlig unabhängig voneinander
  • currying bedeutet, Funktionen auf weniger Argumente anzuwenden, als sie benötigen, um eine Funktion der verbleibenden Argumente zu erhalten
  • Überladen bedeutet, mehrere Definitionen für denselben Namen bereitzustellen, und der Compiler wählt bei jeder Verwendung des Namens die verwendete Definition aus
  • weder curry noch overloading sind entweder für die funktionale Programmierung oder die objektorientierte Programmierung spezifisch; sie sind aufgrund der Art und Weise, in der die Sprachen entwickelt wurden, einfach häufiger in historischen Sprachen der einen oder anderen Art verbreitet, was dazu führt, dass sie in einer Art von Sprache nützlicher oder offensichtlicher sind
Ben 16.05.2012, 07:01
quelle
11

Nein, sie sind völlig unabhängig und unähnlich.

Überladen ist eine Technik, die es ermöglicht, dass der gleiche Code bei verschiedenen Typen verwendet wird - oft bekannt in der funktionalen Programmierung als Polymorphismus (in verschiedenen Formen).

Eine polymorphe Funktion:

%Vor%

Hier ist map eine Funktion, die auf jeder Liste funktioniert. Es ist polymorph - es funktioniert genauso gut mit einer Liste von Int als eine Liste von Bäumen von Hashtabellen. Es ist auch höherrangig , da es eine Funktion ist, die eine Funktion als Argument akzeptiert.

Currying ist die Transformation einer Funktion, die eine Struktur von n Argumenten annimmt eine Kette von Funktionen, die jeweils ein Argument aufnehmen.

In Curry-Sprachen können Sie eine beliebige Funktion auf einige ihrer Argumente anwenden, wodurch eine Funktion entsteht, die den Rest der Argumente übernimmt. Die teilweise angewendete Funktion ist ein Abschluss.

Und Sie können eine Curry-Funktion in eine Uncurried-Funktion umwandeln (und umgekehrt), indem Sie die von Curry erfundene Transformation anwenden > und Schönfinkel .

%Vor%     
Don Stewart 16.05.2012 00:44
quelle
1

Überladen hat mehrere Funktionen mit demselben Namen und verschiedenen Parametern.

Beim Currying können Sie mehrere Parameter verwenden und selektiv einige festlegen, sodass Sie beispielsweise nur eine Variable haben können.

Wenn Sie also eine grafische Funktion in drei Dimensionen haben, haben Sie möglicherweise: justgraphit(double[] x, double[] y, double[] z) , und Sie möchten es grafisch darstellen.

Beim Curry könntest du: var fx = justgraphit(xlist)(y)(z) , wo Sie nun fx gesetzt haben, so dass es jetzt zwei Variablen hat.

Dann wählt der Benutzer später eine andere Achse (Datum) und Sie setzen das y, so dass Sie jetzt haben: var fy = fx(ylist)(z)

Dann, später, zeichnen Sie die Informationen, indem Sie einfach einige Daten durchlaufen und die einzige Variabilität ist der Parameter z .

Dies macht komplizierte Funktionen einfacher, da Sie die weitgehend gesetzten Variablen nicht weiterreichen müssen, so dass die Lesbarkeit zunimmt.

    
James Black 16.05.2012 00:51
quelle