Konwencja nazewnictwa dla funkcji wyższego rzędu? [Zamknięte]

15

Czy istnieje konwencja nazewnictwa dla funkcji wyższego rzędu? Oznacza to, że funkcje zwracają inne funkcje.

Przykład w 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]

Zazwyczaj pisałem to tak jak powyżej: to znaczy optymalizując czytelność w punkcie wywołania (przeczytałem ostatnie linie powyżej jako „przefiltruj tablicę, aby uzyskać elementy podzielne tylko przez 5”), jednak w punkcie definicji dalej z kontekstu, w jakim jest używana, nie jest łatwo zrozumieć, co robi ta funkcja na podstawie jej nazwy.

pseudonim
źródło
4
To zaskakujące, zawsze rozumiałem termin „funkcja wyższego rzędu” jako funkcję, która przyjęła inną funkcję jako argument. Nie twierdzę, że się mylisz, po prostu uważam różnicę w naszym zrozumieniu za interesującą.
Racheet,
6
Funkcje @Racheet, które zwracają funkcje, są również wyższego rzędu. Mogą zrobić jedno i drugie.
itsbruce,
3
@Racheet to dobry punkt i dość istotny dla tego przykładu: to, co OP naprawdę wdraża, to częściowe zastosowanie. Wiele (wszyscy nie są pewni) zastosowań, w których zwracane są funkcje, można postrzegać zamiast tego jako częściową aplikację. @ nickf: oto czystszy sposób na wdrożenie Twojego przykładu

Odpowiedzi:

14

Nie, nie sądzę, że potrzebujesz specjalnej konwencji nazewnictwa, aby wskazać, że zwracasz funkcję. Jak widać z języków, w których funkcje są curry , zwracanie funkcji jest w zasadzie takie samo jak posiadanie funkcji z wieloma argumentami. np. jest niewielka różnica między onlyDivisibleBy(3)(6)ionlyDivisibleBy(3,6)

Zmieniłbym nazwę z onlyDivisibleByna isDivisibleBychociaż, ponieważ uważam, że isjest to bardziej powszechny sposób wskazywania predykatu i onlyDivisibleBy(3)(6)wydaje się dziwny do powrotu, truebiorąc pod uwagę, że 6 wyraźnie można podzielić przez 2

jk.
źródło
5

W silnie typowanych językach funkcjonalnych z sygnatury funkcji wynika, co jest funkcją wyższego rzędu, a co nie, więc po prostu nie ma takiej potrzeby.

W innych językach nigdy nie spotkałem się z taką konwencją nazewnictwa i nie mogę wymyślić takiej, która nie byłaby po prostu uciążliwa. Myślę, że lepiej skoncentrować się na funkcjach nazewnictwa, niż przeciążać takie nazwy.

itsbruce
źródło
4

Nie i nie powinieneś ich używać.

Dlaczego?

Ponieważ byłby to rodzaj węgierskiego zapisu . Chodzi o to, że funkcje przekazywane do funkcji wyższego rzędu są tylko rodzajem zmiennych. Więc traktuj je w ten sposób.

Wilbert
źródło
1
Implikacja polega na tym, że za wszelką cenę należy unikać notowania węgierskiego? Polecam lekturę Making Wrong Code Look Wrong
TehShrike
4
Przeczytałem o tym wcześniej i nadal uważam, że węgierski zapis jest zły :)
Wilbert
@TehShrike Twój link jest uszkodzony.
corvus_192
1
@ corvus_192 musiał zgubić się w przeprojektowaniu bloga Joela! Nowy adres URL wydaje się być joelonsoftware.com/2005/05/11/making-wrong-code-look-wrong
TehShrike