Qualsiasi differenza tra la funzione di prima classe e la funzione di ordine superiore


Risposte:


154

C'è una differenza. Quando dici che una lingua ha funzioni di prima classe, significa che la lingua tratta le funzioni come valori - che puoi assegnare una funzione in una variabile, passarla in giro ecc. Le funzioni di ordine superiore sono funzioni che funzionano su altre funzioni, il che significa che prendono una o più funzioni come argomento e possono anche restituire una funzione.

Il concetto di "ordine superiore" può essere applicato a funzioni in generale, come funzioni in senso matematico. Il concetto di "prima classe" riguarda solo le funzioni nei linguaggi di programmazione. Viene usato raramente quando si fa riferimento a una funzione, come "una funzione di prima classe". È molto più comune affermare che "una lingua non ha / non ha il supporto di funzioni di prima classe".

Le due cose sono strettamente correlate, poiché è difficile immaginare un linguaggio con funzioni di prim'ordine che non supporterebbe anche funzioni di ordine superiore e viceversa un linguaggio con funzioni di ordine superiore ma senza supporto di funzioni di prima classe.


2
Penso che una cosa che mi confonda facilmente sia che siano strettamente correlati.
Simon,

63
@Simon Penso che la chiave per evitare confusione sia ricordare che una lingua ha funzioni di prima classe (puoi anche parlare di altre cose "di prima classe", come le classi di prima classe, ecc.), Oppure no. Quindi non parli mai di una funzione particolare di prima classe o no. OTOH, quando dici che una funzione è di ordine superiore o meno, ciò dice semplicemente se opera su funzioni, quindi "ordine superiore" è una proprietà di ogni singola funzione. Quindi "ha funzioni di prima classe" è una proprietà di una lingua e "è di ordine superiore" è una proprietà di una funzione.
Ben

Esatto Ben. Pensavo che quei due fossero entrambi proprietà della funzione, quindi ero confuso. Grazie dei tuoi commenti
Simon,

Inoltre, è bene tenere presente che le "funzioni di prima classe" NON coincidono con il supporto di chiusura. Ad esempio, in C supporta "funzioni di prima classe" tramite i puntatori a funzione. Tuttavia, C non supporta alcuna nozione di funzione nidificata e quindi non supporta le chiusure.
Tac-Tics,

1
@ Tac-Tics le definizioni sono certamente soggettive e aperte al dibattito, ma personalmente preferisco pensare che C supporti solo funzioni di ordine superiore (tramite i puntatori di funzione). Tuttavia, le funzioni di prima classe non sono supportate perché le funzioni sono inferiori ad altri tipi di valore come into char, nel senso che non possono essere esplicitamente definite (da un corpo di funzione) dove si desidera.
wlnirvana,

67

Le funzioni di prima classe sono funzioni trattate come un oggetto (o assegnabili a una variabile).

Le funzioni di ordine superiore sono funzioni che accettano almeno una funzione di prima classe come parametro o restituiscono almeno una funzione di prima classe.


20

Sono diversi.

Funzioni di prima classe

I valori in una lingua che sono gestiti in modo uniforme in tutto sono chiamati "prima classe". Possono essere archiviati in strutture di dati, passati come argomenti o utilizzati in strutture di controllo.

I linguaggi che supportano valori con tipi di funzione e li trattano allo stesso modo di valori non funzionali, si può dire che abbiano "funzioni di prima classe".

Funzioni di ordine superiore

Una delle conseguenze di avere funzioni di prima classe è che dovresti essere in grado di passare una funzione come argomento a un'altra funzione. Quest'ultima funzione è ora "ordine superiore". È una funzione che accetta una funzione come argomento.

L'esempio canonico è "mappa"

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

Cioè, prende una funzione e un array e restituisce un nuovo array con la funzione applicata a ciascun elemento.

Linguaggi funzionali - linguaggi in cui le funzioni sono il mezzo principale per creare programmi - tutte hanno funzioni di prima classe. La maggior parte ha anche funzioni di ordine superiore (eccezioni molto rare sono lingue come Excel, che si può dire che sia funzionale, ma non di ordine superiore).


1
Grazie don. È completo. E penso che la fase "Una delle conseguenze" indichi una sorta di relazione tra quei due.
Simon,

10

Oltre alle risposte precedenti, nota che un linguaggio con funzioni di prima classe abilita automaticamente l'espressione di funzioni di ordine superiore (perché puoi passare funzioni come parametri come qualsiasi altro valore).

D'altra parte, puoi immaginare linguaggi che supportano funzioni di ordine superiore, ma non rendono le funzioni di prima classe (e in cui i parametri che sono funzioni sono trattati in modo speciale e diversi dai parametri di valore "ordinario").

Quindi la presenza di funzioni di prima classe (come caratteristica del linguaggio) implica la presenza di funzioni di ordine superiore, ma non viceversa.


Potete per favore fare un esempio in cui una funzione di ordine superiore non è una funzione di prima classe. (Pensavo che fossero entrambi uguali.)
ATHER,

@ATHER, non ho un esempio concreto di un linguaggio che farebbe una scelta del genere per funzioni come tali. Ma qualcosa di simile è il caso, ad esempio, dei modelli in C ++: i modelli sono di ordine superiore (è possibile avere "parametri dei modelli di modello"), ma non i valori di prima classe, ovvero i modelli non possono essere parametri delle normali funzioni. Analogamente ad es. Moduli / funzioni in ML.
Andreas Rossberg,

@AndreasRossberg Java 8 non sarebbe una risposta valida alla sua domanda? Le funzioni non sono cittadini di prima classe, ma i metodi Java possono ricevere funzioni (tramite interfacce funzionali), come descritto da te come "parametri che sono funzioni trattate in modo speciale e differenti da parametri di valore" ordinari ".
Abdul,

1

Le funzioni di prima classe possono:

  • Essere memorizzati in variabili
  • Essere restituito da una funzione.
  • Essere passati come argomenti in un'altra funzione.

La funzione di ordine superiore è una funzione che restituisce un'altra funzione.

Per esempio:

function highOrderFunc() {
  return function () {
    alert('hello');
  };
}

0

Le funzioni di prima classe significano tutto ciò che puoi fare con altri tipi (variabili, valori booleani, numeri ...), puoi farlo con le funzioni.

Ad esempio, assegnali a variabili, passali in giro, creali al volo.

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.