2012-04-13 19 views

Odpowiedz

103

Istnieje 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ą itd. Funkcje wyższego rzędu są funkcjami, które działają na inne funkcje, co oznacza że przyjmują jedną lub więcej funkcji jako argument, a także mogą zwracać funkcję.

Pojęcie "wyższego rzędu" można stosować do ogólnych funkcji, takich jak funkcje w sensie matematycznym. Koncepcja "pierwszej klasy" dotyczy jedynie funkcji w językach programowania. Jest rzadko używany w odniesieniu do funkcji, takiej jak "funkcja pierwszej klasy". O wiele częściej mówi się, że "język ma/nie ma pierwszorzędnego wsparcia funkcji".

Dwie rzeczy są ze sobą ściśle powiązane, ponieważ trudno wyobrazić sobie język z pierwszorzędnymi funkcjami, które nie obsługują również funkcji wyższego rzędu, i odwrotnie - język z funkcjami wyższego rzędu, ale bez pierwszorzędnej obsługi funkcji.

+2

Myślę, że jedną rzecz łatwo mnie pogmatwać jest to, że są blisko spokrewnione. – Simon

+33

@Simon Myślę, że kluczem do uniknięcia zamieszania jest pamiętanie, że język ma funkcje pierwszej klasy (możesz także mówić o innych "pierwszorzędnych" rzeczach, takich jak klasy pierwszej itd.), Lub nie . Więc nigdy nie mówisz o ** konkretnej funkcji ** o pierwszej klasie, czy też nie. OTOH, kiedy mówisz, że funkcja jest wyższego rzędu lub nie, to po prostu mówi, czy działa na funkcjach, czy też "wyższego rzędu" jest właściwością każdej pojedynczej funkcji. Zatem "ma funkcje pierwszej klasy" jest własnością języka, a "jest wyższym rzędem" jest własnością funkcji. – Ben

+0

Dokładnie Ben. Myślałem, że te dwie są własnością dla funkcji, więc byłem zdezorientowany. Dzięki twoim komentarzom. – Simon

37

Funkcje pierwszej klasy to funkcje traktowane jak obiekt (lub przypisywane do zmiennej).

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

16

Są różne.

pierwszej klasy funkcje

wartości w języku, które są obsługiwane równomiernie nazywane są „pierwsza klasa”. Mogą być przechowywane w strukturach danych, przekazywane jako argumenty lub używane w strukturach kontrolnych.

Języki, które obsługują wartości z typami funkcji i traktują je tak samo jak wartości niefunkcjonalne, można powiedzieć, że mają "funkcje pierwszej klasy".

funkcja wyższego rzędu

Jedną z konsekwencji posiadające funkcje pierwszej klasy jest to, że powinieneś być w stanie przekazać funkcję jako argument do innej funkcji. Ta ostatnia funkcja jest teraz "wyższym rzędem". Jest to funkcja, która przyjmuje funkcję jako argument.

Klasycznym przykładem jest „map”

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

Oznacza to, że ma funkcję, oraz tablicę i zwraca nową tablicę funkcji stosowanej do każdego elementu.

Języki funkcjonalne - języki, w których funkcje są podstawowymi środkami budowania programów - wszystkie mają funkcje pierwszej klasy. Większość ma także funkcje wyższego rzędu (bardzo rzadkimi wyjątkami są języki takie jak Excel, które można uznać za funkcjonalne, ale nie w wyższej kolejności).

+1

Dzięki Don. Jest kompleksowy. I myślę, że faza "Jedna z konsekwencji" wskazuje na rodzaj relacji między tymi dwoma. – Simon

9

Oprócz poprzednich odpowiedzi, należy pamiętać, że język z funkcjami pierwszej klasy automatycznie włącza wyrażanie funkcji wyższego rzędu (ponieważ można przekazać funkcje 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 tworzą funkcji pierwszej klasy (i gdzie parametry, które są funkcjami, są traktowane specjalnie i różnią się od "zwykłych" parametrów wartości).

Obecność funkcji najwyższej klasy (jako cechy językowej) oznacza obecność funkcji wyższego rzędu, ale nie na odwrót.

+0

Czy możesz podać przykład, w którym funkcja wyższego rzędu nie jest funkcją pierwszej klasy. (Sądzę, że obie są takie same.) – ATHER

+0

@ATHER, nie mam konkretnego przykładu języka, który dokonałby takiego wyboru projektu dla funkcji jako takich. Ale jest coś podobnego, na przykład z szablonami w C++: szablony są wyższego rzędu (możesz mieć "parametry szablonu szablonu"), ale nie wartości pierwszej klasy, tzn. szablony nie mogą być parametrami do zwykłych funkcji. Podobnie z np. moduły/funktory w ML. –

+0

@AndreasRossberg Czy Java 8 nie byłaby poprawną odpowiedzią na jego pytanie? Funkcje nie są pierwszorzędnymi obywatelami, ale metody Java mogą odbierać funkcje (poprzez funkcjonalne interfejsy), jak to opisują "parametry, które są funkcjami traktowanymi specjalnie i różnią się od" zwykłych "parametrów wartości." – Abdul

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, przeprowadź je, utwórz je w locie.

Powiązane problemy