Toute différence entre la fonction de première classe et la fonction d'ordre élevé

Réponses:

154

Il existe une différence. Quand vous dites qu'un langage a des fonctions de première classe, cela signifie que le langage traite les fonctions comme des valeurs - que vous pouvez affecter une fonction à une variable, la transmettre, etc. Les fonctions d'ordre supérieur sont des fonctions qui fonctionnent sur d'autres fonctions, c'est-à-dire qu'ils prennent une ou plusieurs fonctions comme argument et peuvent également renvoyer une fonction.

Le concept «d'ordre supérieur» peut être appliqué aux fonctions en général, comme les fonctions au sens mathématique. Le concept de «première classe» ne concerne que les fonctions des langages de programmation. Il est rarement utilisé pour désigner une fonction, comme «une fonction de première classe». Il est beaucoup plus courant de dire qu '«un langage a / n'a pas un support fonctionnel de première classe».

Les deux choses sont étroitement liées, car il est difficile d'imaginer un langage avec des fonctions de première classe qui ne prendrait pas également en charge les fonctions d'ordre supérieur, et inversement un langage avec des fonctions d'ordre supérieur mais sans support de fonctions de premier ordre.

zoul
la source
2
Je pense qu'une chose me confond facilement, c'est qu'ils sont étroitement liés.
Simon
63
@Simon Je pense que la clé pour éviter toute confusion est de se rappeler qu'un langage a soit des fonctions de première classe (vous pouvez aussi parler d'autres choses «de première classe», comme des cours de première classe, etc.), soit ce n'est pas le cas. Donc, vous ne parlez jamais d' une fonction particulière comme étant de première classe ou non. OTOH, quand vous dites qu'une fonction est d'ordre supérieur ou non, cela dit simplement si elle opère ou non sur des fonctions, donc "l'ordre supérieur" est une propriété de chaque fonction individuelle. Donc "a des fonctions de première classe" est une propriété d'un langage, et "est d'ordre supérieur" est une propriété d'une fonction.
Ben
Exactement Ben. Je pensais que ces deux éléments étaient tous deux une propriété de la fonction, donc j'étais confus. Merci pour vos commentaires.
Simon
Aussi, il est bon de garder à l'esprit que les «fonctions de première classe» ne sont PAS les mêmes que le support de fermeture. Par exemple, en C prend en charge les «fonctions de première classe» via des pointeurs de fonction. Cependant, C ne prend en charge aucune notion de fonction imbriquée, et donc, ne prend pas en charge les fermetures.
Tac-Tics
1
@ Tac-Tics les définitions sont certes subjectives et sujettes à débat, mais personnellement je préfère penser que C ne supporte que les fonctions d'ordre supérieur (via des pointeurs de fonction). Cependant, les fonctions de première classe ne sont pas prises en charge car les fonctions sont inférieures à d'autres types de valeur comme intou char, dans le sens où elles ne peuvent pas être explicitement définies (par un corps de fonction) où vous le souhaitez.
wlnirvana
67

Les fonctions de première classe sont des fonctions traitées comme un objet (ou assignables à une variable).

Les fonctions d'ordre supérieur sont des fonctions qui prennent au moins une fonction de première classe comme paramètre ou qui renvoient au moins une fonction de première classe.

AshleyS
la source
20

Ils sont différents.

Fonctions de première classe

Les valeurs dans une langue qui sont gérées de manière uniforme partout sont appelées «première classe». Ils peuvent être stockés dans des structures de données, passés comme arguments ou utilisés dans des structures de contrôle.

Les langages qui prennent en charge des valeurs avec des types de fonction et les traitent de la même manière que des valeurs non fonctionnelles peuvent être considérés comme ayant des «fonctions de première classe».

Fonctions d'ordre supérieur

L'une des conséquences d'avoir des fonctions de première classe est que vous devriez pouvoir passer une fonction comme argument à une autre fonction. Cette dernière fonction est désormais «d'ordre supérieur». C'est une fonction qui prend une fonction comme argument.

L'exemple canonique est "carte"

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

Autrement dit, il prend une fonction et un tableau et retourne un nouveau tableau avec la fonction appliquée à chaque élément.

Les langages fonctionnels - langages où les fonctions sont le principal moyen de créer des programmes - ont tous des fonctions de première classe. La plupart ont également des fonctions d'ordre supérieur (de très rares exceptions étant des langages comme Excel, qui peuvent être considérés comme fonctionnels, mais pas d'ordre supérieur).

Don Stewart
la source
1
Merci Don. C'est complet. Et je pense que la phase «Une des conséquences» indique une sorte de relation entre ces deux.
Simon
10

En plus des réponses précédentes, notez qu'un langage avec des fonctions de première classe active automatiquement l'expression de fonctions d'ordre supérieur (car vous pouvez passer des fonctions comme paramètres comme toute autre valeur).

D'un autre côté, vous pouvez imaginer des langages qui prennent en charge des fonctions d'ordre supérieur, mais ne font pas de fonctions de première classe (et où les paramètres qui sont des fonctions sont traités spécialement, et différents des paramètres de valeur "ordinaires").

Ainsi, la présence de fonctions de première classe (en tant que caractéristique du langage) implique la présence de fonctions d'ordre supérieur, mais pas l'inverse.

Andreas Rossberg
la source
Pouvez-vous s'il vous plaît donner un exemple où une fonction d'ordre supérieur n'est pas une fonction de première classe. (Je pensais que les deux étaient identiques.)
ATHER
@ATHER, je n'ai pas d'exemple concret d'un langage qui ferait un tel choix de conception pour les fonctions en tant que telles. Mais quelque chose de similaire est le cas, par exemple avec les modèles en C ++: les modèles sont d'ordre supérieur (vous pouvez avoir des "paramètres de modèle de modèle"), mais pas des valeurs de première classe, c'est-à-dire que les modèles ne peuvent pas être des paramètres de fonctions ordinaires. De même avec par exemple des modules / foncteurs dans ML.
Andreas Rossberg
@AndreasRossberg Java 8 ne serait-il pas une réponse valable à sa question? Les fonctions ne sont pas des citoyens de première classe, mais les méthodes Java peuvent recevoir des fonctions (via des interfaces fonctionnelles), comme vous l'avez décrit comme "les paramètres qui sont des fonctions sont traités spécialement et différents des paramètres de valeur" ordinaires "."
Abdul
1

Les fonctions de première classe peuvent:

  • Être stocké dans des variables
  • Être renvoyé d'une fonction.
  • Être passé comme arguments dans une autre fonction.

La fonction d'ordre élevé est une fonction qui renvoie une autre fonction.

Par exemple:

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

Les fonctions de première classe signifient tout ce que vous pouvez faire avec d'autres types (variables, booléens, nombres ...), vous pouvez le faire avec des fonctions.

Par exemple, assignez-les à des variables, transmettez-les, créez-les à la volée.

Ishan Patel
la source