Convención de nomenclatura para funciones de orden superior? [cerrado]

15

¿Existe una convención de nomenclatura para funciones de orden superior? Es decir, funciones que devuelven otras funciones.

Un ejemplo 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]

He tendido a escribirlo como se indica arriba: es decir, optimizar la legibilidad en el punto de invocación (leería las últimas líneas de arriba como "filtrar la matriz para obtener elementos solo divisibles por 5"), sin embargo, en el punto de definición desde el contexto en el que se usa, no es tan fácil entender lo que hace esta función desde su nombre.

nickf
fuente
44
Es sorprendente, siempre he entendido que el término "función de orden superior" significa una función que aceptaba otra función como argumento. No digo que estés equivocado, solo encuentro interesante la diferencia en nuestra comprensión.
Racheet
66
Las funciones de @Racheet que devuelven funciones también son de orden superior. Pueden hacer las dos cosas.
itsbruce
3
@Racheet es un buen punto y bastante relevante para este ejemplo: lo que el OP realmente está implementando es una aplicación parcial. En su lugar, muchos usos (¿todos? @ nickf: aquí hay una forma más limpia de implementar su ejemplo

Respuestas:

14

No, no creo que necesite una convención de nomenclatura especial para indicar que está devolviendo una función. Como podemos ver en los lenguajes en los que las funciones tienen currículum , devolver una función es esencialmente lo mismo que tener una función con múltiples argumentos. por ejemplo, hay poca diferencia entre onlyDivisibleBy(3)(6)yonlyDivisibleBy(3,6)

Sin embargo, cambiaría el nombre de onlyDivisibleBya, isDivisibleByya que creo que ises una forma más común de indicar un predicado y onlyDivisibleBy(3)(6)parece extraño regresar truedado que 6 claramente también es divisible por 2

jk.
fuente
5

En lenguajes funcionales fuertemente tipados, es evidente a partir de la firma de la función qué es una función de orden superior y qué no lo es, por lo que simplemente no hay necesidad.

En otros idiomas, nunca me he encontrado con una convención de nombres así y no puedo pensar en una que no sea simplemente engorrosa. Creo que es mejor concentrarse en las funciones de nombres que sobrecargar los nombres así.

itsbruce
fuente
4

No, y no debes usar ninguno.

¿Por qué?

Porque eso sería una especie de notación húngara . La idea es exactamente que las funciones pasadas a funciones de orden superior son solo un tipo de variables. Así que trátalos así.

Wilbert
fuente
1
¿La implicación es que la notación húngara se debe evitar a toda costa? Recomiendo leer Cómo hacer que el código incorrecto
parezca
44
Lo he leído antes, y todavía creo que la notación húngara es mala :)
Wilbert
@TehShrike Su enlace está roto.
corvus_192
1
¡@ corvus_192 debe haberse perdido en el rediseño del blog de Joel! Nueva URL parece ser joelonsoftware.com/2005/05/11/making-wrong-code-look-wrong
TehShrike