Convention de dénomination pour les fonctions d'ordre supérieur? [fermé]

15

Existe-t-il une convention de dénomination pour les fonctions d'ordre supérieur? Autrement dit, les fonctions qui renvoient d'autres fonctions.

Un exemple en Javascript:

function onlyDivisibleBy(div) { // <-- higher order function
  return function (n) {
    return n % div === 0;
  }
}

var arr = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];

arr.filter(onlyDivisibleBy(3)); // [0, 3, 6, 9]
arr.filter(onlyDivisibleBy(5)); // [0, 5]

J'ai eu tendance à l'écrire comme ci-dessus: c'est-à-dire, en optimisant la lisibilité au point d'invocation (je lirais les dernières lignes ci-dessus comme "filtrer le tableau pour obtenir les éléments uniquement divisibles par 5"), mais au point de définition plus loin du contexte dans lequel il est utilisé, il n'est pas si facile de comprendre ce que cette fonction fait de son nom.

nickf
la source
4
C'est surprenant, j'avais toujours compris que l'expression "fonction d'ordre supérieur" signifiait une fonction qui acceptait une autre fonction comme argument. Je ne dis pas que vous vous trompez, je trouve juste la différence dans notre compréhension intéressante.
Racheet
6
Les fonctions @Racheet qui renvoient des fonctions sont également d'ordre supérieur. Ils peuvent faire les deux.
itsbruce
3
@Racheet c'est un bon point et tout à fait pertinent pour cet exemple: ce que l'OP implémente vraiment, c'est une application partielle. De nombreuses utilisations (toutes? Pas sûres) où les fonctions sont renvoyées peuvent être considérées à la place comme une application partielle. @ nickf: voici une façon plus propre d'implémenter votre exemple

Réponses:

14

Non, je ne pense pas que vous ayez besoin d'une convention de dénomination spéciale pour indiquer que vous retournez une fonction. Comme nous pouvons le voir dans les langages où les fonctions sont curry , le retour d'une fonction est essentiellement la même chose que d'avoir une fonction avec plusieurs arguments. par exemple, il y a peu de différence entre onlyDivisibleBy(3)(6)etonlyDivisibleBy(3,6)

Je changerais le nom de onlyDivisibleByla isDivisibleBybien que je pense isest une façon plus commune pour indiquer un prédicat et onlyDivisibleBy(3)(6)semble étrange de retour trueétant donné que 6 est clairement divisible par 2

jk.
la source
5

Dans les langages fonctionnels fortement typés, il est évident d'après la signature de fonction ce qui est une fonction d'ordre supérieur et ce qui ne l'est pas, donc il n'y a tout simplement pas besoin.

Dans d'autres langues, je n'ai jamais rencontré une telle convention de dénomination et je ne peux pas penser à une qui ne serait pas simplement encombrante. Mieux vaut se concentrer sur les fonctions de nommage bien que de surcharger les noms comme ça, je pense.

itsbruce
la source
4

Non, et vous ne devez en utiliser aucun.

Pourquoi?

Parce que ce serait une sorte de notation hongroise . L'idée est exactement que les fonctions passées à des fonctions d'ordre supérieur ne sont qu'une sorte de variables. Alors traitez-les comme ça.

Wilbert
la source
1
L'implication étant que la notation hongroise doit être évitée à tout prix? Je recommanderais de lire Rendre le code incorrect
faux
4
J'ai déjà lu ça, et je pense toujours que la notation hongroise est mauvaise :)
Wilbert
@TehShrike Votre lien est rompu.
corvus_192
1
@ corvus_192 doit s'être perdu dans la refonte du blog de Joel! La nouvelle URL semble être joelonsoftware.com/2005/05/11/making-wrong-code-look-wrong
TehShrike