Wszelkie różnice między funkcją pierwszej klasy a funkcją wyższego rzędu

Odpowiedzi:

157

Jest różnica. Kiedy mówisz, że język ma funkcje pierwszej klasy, oznacza to, że język traktuje funkcje jako wartości - że możesz przypisać funkcję do zmiennej, przekazać ją innym itp. Funkcje wyższego rzędu to funkcje, które działają na innych funkcjach, co oznacza że przyjmują jedną lub więcej funkcji jako argument i mogą również zwrócić funkcję.

Pojęcie „wyższego rzędu” można zastosować do funkcji w ogóle, takich jak funkcje w sensie matematycznym. Koncepcja „pierwszej klasy” dotyczy tylko funkcji w językach programowania. Rzadko jest używany w odniesieniu do funkcji, takiej jak „funkcja pierwszej klasy”. O wiele częściej mówi się, że „język ma / nie obsługuje funkcji pierwszej klasy”.

Te dwie rzeczy są ze sobą ściśle powiązane, ponieważ trudno sobie wyobrazić język z funkcjami pierwszej klasy, który nie obsługiwałby również funkcji wyższego rzędu, i odwrotnie, język z funkcjami wyższego rzędu, ale bez obsługi funkcji pierwszej klasy.

zoul
źródło
2
Myślę, że łatwo mnie zmylić, bo są blisko spokrewnieni.
Simon
63
@Simon Myślę, że kluczem do uniknięcia nieporozumień jest zapamiętanie, że język albo ma funkcje pierwszej klasy (możesz też mówić o innych rzeczach „pierwszej klasy”, takich jak klasy pierwszej, itp.), Albo nie. Więc nigdy nie mówisz o tym, że dana funkcja jest pierwszorzędna, czy nie. OTOH, kiedy mówisz, że funkcja jest wyższego rzędu, czy nie, to po prostu mówi, czy operuje na funkcjach, czy nie, więc „wyższego rzędu” jest właściwością każdej indywidualnej funkcji. Zatem „ma funkcje pierwszej klasy” jest właściwością języka, a „jest wyższego rzędu” jest właściwością funkcji.
Ben
Dokładnie Ben. Myślałem, że te dwa są własnością funkcji, więc byłem zdezorientowany. Dziękuję za komentarze.
Simon
Warto też pamiętać, że „funkcje pierwszej klasy” to NIE to samo, co obsługa zamykania. Na przykład w języku C obsługuje „funkcje pierwszej klasy” za pośrednictwem wskaźników funkcji. Jednak C nie obsługuje żadnego pojęcia funkcji zagnieżdżonej, więc nie obsługuje domknięć.
Tac-Tics
1
@ Tac-Tics definicje są z pewnością subiektywne i otwarte na debatę, ale osobiście wolę myśleć, że C obsługuje tylko funkcje wyższego rzędu (poprzez wskaźniki funkcji). Jednak funkcje pierwszej klasy nie są obsługiwane, ponieważ są gorsze od innych typów wartości, takich jak intlub char, w tym sensie, że nie można ich jawnie zdefiniować (przez treść funkcji), gdziekolwiek chcesz.
wlnirvana
69

Funkcje pierwszej klasy to funkcje, które są traktowane jak obiekt (lub można je przypisać do zmiennej).

Funkcje wyższego rzędu to funkcje, które przyjmują co najmniej jedną funkcję pierwszej klasy jako parametr lub zwracają co najmniej jedną funkcję pierwszej klasy.

AshleyS
źródło
20

Są różni.

Funkcje pierwszej klasy

Wartości w języku, które są obsługiwane jednolicie w całym języku, nazywane są „pierwszą klasą”. Mogą być przechowywane w strukturach danych, przekazywane jako argumenty lub używane w strukturach sterujących.

O językach, które obsługują wartości z typami funkcji i traktują je tak samo jak wartości niebędące funkcjami, można powiedzieć, że mają „funkcje pierwszej klasy”.

Funkcje wyższego rzędu

Jedną z konsekwencji posiadania funkcji pierwszej klasy jest to, że powinieneś być w stanie przekazać funkcję jako argument do innej funkcji. Ta ostatnia funkcja jest teraz „wyższego rzędu”. Jest to funkcja, która przyjmuje funkcję jako argument.

Przykład kanoniczny to „mapa”

map :: (a -> b) -> [a] -> [b]
map f []     = []
map f (x:xs) = f x : map f xs

Oznacza to, że pobiera funkcję i tablicę i zwraca nową tablicę z funkcją zastosowaną do każdego elementu.

Języki funkcyjne - języki, w których funkcje są podstawowym środkiem budowania programów - wszystkie mają funkcje pierwszej klasy. Większość ma również funkcje wyższego rzędu (bardzo rzadkimi wyjątkami są języki takie jak Excel, o którym można powiedzieć, że jest funkcjonalny, ale nie wyższego rzędu).

Don Stewart
źródło
1
Dzięki, Don. To kompleksowe. Myślę, że faza „Jedna z konsekwencji” wskazuje na pewien rodzaj związku między tymi dwoma.
Simon
11

Oprócz poprzednich odpowiedzi zwróć uwagę, że język z funkcjami pierwszej klasy automatycznie umożliwia wyrażanie funkcji wyższego rzędu (ponieważ funkcje można przekazywać jako parametry, jak każda inna wartość).

Z drugiej strony można sobie wyobrazić języki, które obsługują funkcje wyższego rzędu, ale nie czynią funkcji pierwszorzędnymi (i gdzie parametry, które są funkcjami, są traktowane specjalnie i różnią się od „zwykłych” parametrów wartości).

Zatem obecność funkcji pierwszej klasy (jako cechy języka) implikuje obecność funkcji wyższego rzędu, ale nie na odwrót.

Andreas Rossberg
źródło
Czy możesz podać przykład, w którym funkcja wyższego rzędu nie jest funkcją pierwszej klasy. (Myślałem, że oba są takie same.)
ATHER
@ATHER, nie mam konkretnego przykładu języka, który dokonałby takiego wyboru projektu dla funkcji jako takich. Ale podobnie jest w przypadku np. Szablonów w C ++: szablony są wyższego rzędu (możesz mieć „parametry szablonu szablonu”), ale nie wartości pierwszej klasy, tj. Szablony nie mogą być parametrami zwykłych funkcji. Podobnie jest np. Z modułami / funktorami w ML.
Andreas Rossberg
@AndreasRossberg Czy Java 8 nie byłaby poprawną odpowiedzią na jego pytanie? Funkcje nie są obywatelami pierwszej klasy, ale metody Java mogą odbierać funkcje (poprzez interfejsy funkcjonalne), co zostało opisane przez ciebie jako „parametry, które są funkcjami, są traktowane specjalnie i różnią się od„ zwykłych ”parametrów wartości”.
Abdul
1

Funkcje pierwszej klasy mogą:

  • Być przechowywane w zmiennych
  • Zwracany z funkcji.
  • Należy przekazywać jako argumenty do innej funkcji.

Funkcja wysokiego rzędu to funkcja zwracająca inną funkcję.

Na przykład:

function highOrderFunc() {
  return function () {
    alert('hello');
  };
}
techkuz
źródło
0

Funkcje pierwszej klasy oznaczają wszystko, co możesz zrobić z innymi typami (zmienne, wartości logiczne, liczby ...), możesz to zrobić za pomocą funkcji.

Na przykład przypisz je do zmiennych, przekaż dalej, utwórz je w locie.

Ishan Patel
źródło