Convenzione di denominazione per funzioni di ordine superiore? [chiuso]


15

Esiste una convenzione di denominazione per le funzioni di ordine superiore? Cioè, funzioni che restituiscono altre funzioni.

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

Ho teso a scriverlo come sopra: cioè, ottimizzando per la leggibilità nel punto di invocazione (avrei letto le ultime righe sopra come "filtrare l'array per ottenere elementi divisibili solo per 5"), tuttavia al punto di definizione lontano dal contesto in cui viene utilizzato, non è così facile capire cosa fa questa funzione dal suo nome.


4
È sorprendente, ho sempre capito che il termine "funzione di ordine superiore" significa una funzione che ha accettato un'altra funzione come argomento. Non sto dicendo che ti sbagli, trovo solo interessante la differenza nella nostra comprensione.
Racheet,

6
Le funzioni @Racheet che restituiscono funzioni sono anche di ordine superiore. Possono fare entrambe le cose.
itsbruce,

3
@Racheet è un buon punto e abbastanza rilevante per questo esempio: ciò che l'OP sta davvero implementando è un'applicazione parziale. Molti usi (tutti non sicuri) in cui vengono restituite le funzioni possono essere visualizzati invece come un'applicazione parziale. @ nickf: ecco un modo più pulito di implementare il tuo esempio

Risposte:


14

No, non penso che tu abbia bisogno di una speciale convenzione di denominazione per indicare che stai restituendo una funzione. Come possiamo vedere dalle lingue in cui le funzioni sono curry , restituire una funzione è essenzialmente lo stesso di avere una funzione con più argomenti. per esempio c'è poca differenza tra onlyDivisibleBy(3)(6)eonlyDivisibleBy(3,6)

Vorrei cambiare il nome da onlyDivisibleByin isDivisibleByanche se penso che issia un modo più comune per indicare un predicato e onlyDivisibleBy(3)(6)sembra strano tornare, truedato che 6 chiaramente è anche divisibile per 2


5

Nei linguaggi funzionali fortemente tipizzati, dalla firma della funzione è evidente cosa sia una funzione di ordine superiore e cosa no, quindi semplicemente non è necessario.

In altre lingue, non mi sono mai imbattuto in una simile convenzione di denominazione e non riesco a pensare a una che non sia solo ingombrante. Meglio concentrarsi sulle funzioni di denominazione piuttosto che sovraccaricare i nomi in quel modo, credo.


4

No, e non dovresti usarne nessuno.

Perché?

Perché sarebbe una specie di notazione ungherese . L'idea è esattamente che le funzioni passate alle funzioni di ordine superiore sono solo una specie di variabili. Quindi trattali così.


1
L'implicazione è che la notazione ungherese deve essere evitata a tutti i costi? Consiglierei di leggere Wrong Code Look Wrong
TehShrike

4
L'ho già letto e credo ancora che la notazione ungherese sia negativa :)
Wilbert,

@TehShrike Il tuo collegamento è interrotto.
corvus_192,

1
@ corvus_192 deve essersi perso nella riprogettazione del blog di Joel! Il nuovo URL sembra essere joelonsoftware.com/2005/05/11/making-wrong-code-look-wrong
TehShrike
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.