Namenskonvention für Funktionen höherer Ordnung? [geschlossen]

15

Gibt es eine Namenskonvention für Funktionen höherer Ordnung? Das heißt, Funktionen, die andere Funktionen zurückgeben.

Ein Beispiel in 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]

Ich neige dazu, es wie oben zu schreiben: das heißt, die Lesbarkeit am Aufrufpunkt zu optimieren (ich habe die letzten Zeilen oben als "das Array filtern, um Elemente zu erhalten, die nur durch 5 teilbar sind" gelesen), jedoch am Definitionspunkt entfernt Aus dem Kontext, in dem es verwendet wird, ist es nicht so einfach zu verstehen, was diese Funktion aus ihrem Namen macht.

nickf
quelle
4
Es ist überraschend, dass ich unter dem Begriff "Funktion höherer Ordnung" immer eine Funktion verstanden habe, die eine andere Funktion als Argument akzeptiert. Ich sage nicht, dass Sie sich irren, ich finde nur den Unterschied in unserem Verständnis interessant.
Racheet
6
@ Racheet-Funktionen, die Funktionen zurückgeben, sind ebenfalls von höherer Ordnung. Sie können beides tun.
itsbruce
3
@ Racheet, das ist ein guter Punkt und für dieses Beispiel ziemlich relevant: Was das OP wirklich implementiert, ist eine teilweise Anwendung. Viele (alle? Nicht sicher) Verwendungszwecke, bei denen Funktionen zurückgegeben werden, können stattdessen als Teilanwendung betrachtet werden. @ nickf: hier ist ein sauberer Weg, um Ihr Beispiel zu implementieren

Antworten:

14

Nein, ich glaube nicht, dass Sie eine spezielle Namenskonvention benötigen, um anzuzeigen, dass Sie eine Funktion zurückgeben. Wie wir aus Sprachen sehen können , wo Funktionen sind curried , ist eine Funktion der Rückkehr im Wesentlichen die gleiche wie eine Funktion mit mehreren Argumenten haben. ZB gibt es kaum einen Unterschied zwischen onlyDivisibleBy(3)(6)undonlyDivisibleBy(3,6)

Ich würde den Namen von onlyDivisibleByin ändern , isDivisibleByda ich denke, dass dies isein gängigerer Weg ist, um ein Prädikat anzuzeigen, und onlyDivisibleBy(3)(6)es seltsam erscheint , wenn man bedenkt, truedass 6 auch eindeutig durch 2 teilbar ist

jk.
quelle
5

In stark typisierten funktionalen Sprachen ist aus der Funktionssignatur ersichtlich, was eine Funktion höherer Ordnung ist und was nicht, so dass einfach keine Notwendigkeit besteht.

In anderen Sprachen bin ich noch nie auf eine solche Namenskonvention gestoßen, und ich kann mir keine vorstellen, die nicht einfach nur umständlich wäre. Ich denke, es ist besser, sich auf die Benennungsfunktionen zu konzentrieren, als die Namen so zu überladen.

itsbruce
quelle
4

Nein, und Sie sollten keine verwenden.

Warum?

Denn das wäre eine Art ungarische Notation . Die Idee ist genau, dass Funktionen, die an Funktionen höherer Ordnung übergeben werden, nur eine Art von Variablen sind. Behandle sie also so.

Wilbert
quelle
1
Die Folge ist, dass die ungarische Notation um jeden Preis vermieden werden muss? Ich würde empfehlen, Making Wrong Code Look Wrong
TehShrike
4
Ich habe das schon einmal gelesen und glaube immer noch, dass die ungarische Notation schlecht ist :)
Wilbert
@TehShrike Dein Link ist kaputt.
corvus_192
1
@ corvus_192 muss sich in Joels Blog-Neugestaltung verlaufen haben! Neue URL scheint zu sein joelonsoftware.com/2005/05/11/making-wrong-code-look-wrong
TehShrike