Jeder Unterschied zwischen First Class Function und High Order Function

Antworten:

154

Da ist ein Unterschied. Wenn Sie sagen, dass eine Sprache erstklassige Funktionen hat, bedeutet dies, dass die Sprache Funktionen als Werte behandelt - Sie können eine Funktion einer Variablen zuweisen, sie weitergeben usw. Funktionen höherer Ordnung sind Funktionen, die mit anderen Funktionen arbeiten, dh dass sie eine oder mehrere Funktionen als Argument verwenden und auch eine Funktion zurückgeben können.

Das Konzept „höherer Ordnung“ kann auf Funktionen im Allgemeinen angewendet werden, wie Funktionen im mathematischen Sinne. Das „erstklassige“ Konzept hat nur mit Funktionen in Programmiersprachen zu tun. Es wird selten verwendet, wenn auf eine Funktion verwiesen wird, beispielsweise auf eine „erstklassige Funktion“. Es ist viel üblicher zu sagen, dass „eine Sprache erstklassige Funktionsunterstützung hat / nicht hat“.

Die beiden Dinge sind eng miteinander verbunden, da es schwer vorstellbar ist, dass eine Sprache mit erstklassigen Funktionen keine Funktionen höherer Ordnung unterstützt, und umgekehrt eine Sprache mit Funktionen höherer Ordnung, jedoch ohne erstklassige Funktionsunterstützung.

Zoul
quelle
2
Ich denke, eine Sache, die mich leicht verwirrt, ist, dass sie eng miteinander verbunden sind.
Simon
63
@Simon Ich denke, der Schlüssel zur Vermeidung von Verwirrung besteht darin, sich daran zu erinnern, dass eine Sprache entweder erstklassige Funktionen hat (Sie können auch über "erstklassige" andere Dinge wie erstklassige Klassen usw. sprechen) oder nicht. Sie sprechen also nie davon, dass eine bestimmte Funktion erstklassig ist oder nicht. OTOH, wenn Sie sagen, dass eine Funktion höherer Ordnung ist oder nicht, heißt das nur, ob sie mit Funktionen arbeitet oder nicht, also ist "höhere Ordnung" eine Eigenschaft jeder einzelnen Funktion. "Hat erstklassige Funktionen" ist also eine Eigenschaft einer Sprache, und "ist höherwertig" ist eine Eigenschaft einer Funktion.
Ben
Genau Ben. Ich dachte, diese beiden sind beide eine Eigenschaft für die Funktion, daher war ich verwirrt. Vielen Dank für Ihre Kommentare.
Simon
Es ist auch gut zu bedenken, dass "erstklassige Funktionen" NICHT mit der Unterstützung von Schließungen identisch sind. Zum Beispiel unterstützt in C "erstklassige Funktionen" über Funktionszeiger. C unterstützt jedoch keine Vorstellung von verschachtelter Funktion und unterstützt daher keine Schließungen.
Tac-Tics
1
@ Tac-Tics die Definitionen sind sicherlich subjektiv und offen für Debatten, aber ich persönlich denke lieber, dass C nur Funktionen höherer Ordnung unterstützt (über Funktionszeiger). Erstklassige Funktionen werden jedoch nicht unterstützt, da Funktionen anderen Werttypen wie intoder charin dem Sinne unterlegen sind, dass sie nicht explizit (durch einen Funktionskörper) definiert werden können, wo immer Sie möchten.
wlnirvana
67

Erstklassige Funktionen sind Funktionen, die wie ein Objekt behandelt werden (oder einer Variablen zugewiesen werden können).

Funktionen höherer Ordnung sind Funktionen, die mindestens eine erstklassige Funktion als Parameter verwenden oder mindestens eine erstklassige Funktion zurückgeben.

AshleyS
quelle
20

Sie sind anders.

Erstklassige Funktionen

Werte in einer Sprache, die durchgehend einheitlich behandelt werden, werden als "First Class" bezeichnet. Sie können in Datenstrukturen gespeichert, als Argumente übergeben oder in Kontrollstrukturen verwendet werden.

Sprachen, die Werte mit Funktionstypen unterstützen und diese wie Nichtfunktionswerte behandeln, können als "erstklassige Funktionen" bezeichnet werden.

Funktionen höherer Ordnung

Eine der Konsequenzen erstklassiger Funktionen ist, dass Sie eine Funktion als Argument an eine andere Funktion übergeben können sollten. Die letztere Funktion ist jetzt "höherer Ordnung". Es ist eine Funktion, die eine Funktion als Argument verwendet.

Das kanonische Beispiel ist "Karte"

map :: (a -> b) -> [a] -> [b]
map f []     = []
map f (x:xs) = f x : map f xs

Das heißt, es benötigt eine Funktion und ein Array und gibt ein neues Array mit der auf jedes Element angewendeten Funktion zurück.

Funktionssprachen - Sprachen, in denen Funktionen das Hauptmittel zum Erstellen von Programmen sind - haben alle erstklassige Funktionen. Die meisten haben auch Funktionen höherer Ordnung (sehr seltene Ausnahmen sind Sprachen wie Excel, die als funktional bezeichnet werden können, aber keine Funktionen höherer Ordnung).

Don Stewart
quelle
1
Danke Don. Es ist umfassend. Und ich denke, Phase "Eine der Konsequenzen" deutet auf eine Art Beziehung zwischen diesen beiden hin.
Simon
10

Beachten Sie zusätzlich zu den vorherigen Antworten, dass eine Sprache mit erstklassigen Funktionen automatisch den Ausdruck von Funktionen höherer Ordnung ermöglicht (da Sie Funktionen wie Parameter wie jeden anderen Wert übergeben können).

Auf der anderen Seite können Sie sich Sprachen vorstellen, die Funktionen höherer Ordnung unterstützen, aber Funktionen nicht erstklassig machen (und bei denen Parameter, die Funktionen sind, speziell behandelt werden und sich von "normalen" Wertparametern unterscheiden).

Das Vorhandensein erstklassiger Funktionen (als Sprachmerkmal) impliziert also das Vorhandensein von Funktionen höherer Ordnung, aber nicht umgekehrt.

Andreas Rossberg
quelle
Können Sie bitte ein Beispiel nennen, bei dem eine Funktion höherer Ordnung keine erstklassige Funktion ist? (Ich dachte, beide sind gleich.)
ATHER
@ATHER, ich habe kein konkretes Beispiel für eine Sprache, die eine solche Entwurfswahl für Funktionen als solche treffen würde. Ähnliches gilt jedoch beispielsweise für Vorlagen in C ++: Vorlagen sind höherwertig (Sie können "Vorlagenvorlagenparameter" haben), aber keine erstklassigen Werte, dh Vorlagen können keine Parameter für normale Funktionen sein. Ähnliches gilt zB für Module / Funktoren in ML.
Andreas Rossberg
@AndreasRossberg Wäre Java 8 keine gültige Antwort auf seine Frage? Funktionen sind keine erstklassigen Bürger, aber Java-Methoden können Funktionen (über funktionale Schnittstellen) empfangen, wie von Ihnen beschrieben als "Parameter, bei denen es sich um Funktionen handelt, die speziell behandelt werden und sich von" normalen "Wertparametern unterscheiden".
Abdul
1

First Class Funktionen können:

  • In Variablen gespeichert werden
  • Von einer Funktion zurückgegeben werden.
  • Als Argumente an eine andere Funktion übergeben werden.

High Order Function ist eine Funktion, die eine andere Funktion zurückgibt.

Beispielsweise:

function highOrderFunc() {
  return function () {
    alert('hello');
  };
}
techkuz
quelle
0

Erstklassige Funktionen bedeuten alles, was Sie mit anderen Typen (Variablen, Booleschen Werten, Zahlen ...) tun können. Sie können dies mit Funktionen tun.

Weisen Sie sie beispielsweise Variablen zu, geben Sie sie weiter und erstellen Sie sie im laufenden Betrieb.

Ishan Patel
quelle