funzioni di ordine superiore costrutto equivalente in TIOBE top 10 lingue [chiuso]

0

Sto cercando di trovare un costrutto linguistico equivalente a funzioni di ordine superiore nelle prime 10 lingue da TIOBE indice.

Ecco i risultati fino ad ora:

  1. C - puntatori di funzioni
  2. Java - metodi anonimi, lambda
  3. Obiettivo-C - puntatori, selettori, blocchi, delegati di funzioni (come spiegato qui )
  4. C ++ - puntatori di funzioni, lambda
  5. Di base - [ missing ]
  6. C # - metodi anonimi, delegati, lambda
  7. Python - [ so che è possibile, ma non so come si chiama ]
  8. PHP - funzioni anonime
  9. Perl - [ missing ]
  10. JavaScript - funzioni

Potresti aiutarmi con le parti mancanti? E alla fine correggere eventuali errori? Non sto cercando soluzioni alternative, ma per costrutti di linguaggio incorporati che consentono di passare una funzione a un'altra funzione.

    
posta Grzegorz Sławecki 02.09.2014 - 12:20
fonte

2 risposte

3

Una funzione di ordine superiore è una funzione che accetta un'altra funzione come argomento. Una funzione di ordine superiore ben nota è map , che esegue un'azione su ciascun elemento di una raccolta, ad esempio:

-- Haskell
map (\x -> 2 * x) [1, 2, 3, 4, 5] -- => [2, 4, 6, 8, 10]

Le funzioni di ordine superiore richiedono che tu possa passare una funzione come valore di prima classe, così come puoi passare attorno a numeri, stringhe o altri oggetti. Questo viene fatto non rendendo affatto speciali le funzioni (cioè sono solo oggetti ordinari con sintassi speciale per crearli), o fornendo una sintassi speciale per ottenere un riferimento a una funzione. Potrebbe anche esserci una sintassi per le funzioni anonime (lambda), ma questo non è strettamente necessario per avere funzioni di ordine più elevate.

Nei linguaggi orientati agli oggetti, è interessante notare che oggetti e chiusure sono equivalenti tra loro. In effetti, molti linguaggi rappresentano funzioni di prima classe come un oggetto con un metodo chiamato apply() o simile. Ancor prima che Java ottenesse lambda, le funzioni di prima classe potevano essere implementate molto verbalmente passando gli oggetti in giro e le classi anonime erano molto simili ai lambda attuali. Il Pattern di comando è essenzialmente una codifica di funzioni di prima classe in un contesto OOP. Quindi qualsiasi linguaggio OOP può avere funzioni di ordine superiore, ma le funzioni di prima classe tendono a implicare una quantità irragionevole di cerimonia.

Le lingue con TO GO calcolati sono anche equivalenti a (in realtà, anche più potenti di) funzioni di prima classe. Mentre tali linguaggi tendono a mancare di molte garanzie del sistema di tipo e rendono facile la scrittura di un oscuro codice di spaghetti, potrebbero essere considerati anche come funzioni di prima classe.

  • C : ha funzioni di puntatori (cioè funzioni di prima classe) e supporta anche funzioni di ordine superiore. Tuttavia, non ha chiusure.
  • Java : esegue OOP e pertanto supporta il modello di comando. Aveva anche classi anonime per un po ', che è una specie di lambda. Con Java 8, ha ottenuto lambdas e sintassi reali per passare metodi come oggetti ordinari. Le chiusure sono limitate.
  • C ++ : ha tutto ciò che C ha, oltre al Command Pattern dovuto a OOP. Ha ottenuto varie forme di lambda nella revisione C ++ 11. Le chiusure sono esplicite e limitate dallo schema di gestione della memoria.
  • Python : è un linguaggio OOP, ma ha anche un numero di influenze Lisp (il Lisp è il linguaggio di programmazione funzionale originale). Le funzioni sono solo oggetti con sintassi di fantasia. L'operatore di chiamata di funzione viene effettivamente tradotto in una chiamata di metodo, il che significa che anche gli oggetti definiti dall'utente possono essere utilizzati come una funzione. Esiste anche una forma di funzioni anonime (espressioni lambda), ma sono ridicolmente limitate. Tutte le funzioni sono chiusure, ma a volte devono essere esplicite a causa delle regole di scoping di Python.
  • JavaScript : è la stessa storia di Python, tranne per il fatto che manca il sovraccarico dell'operatore e non impone restrizioni a lambda. Le chiusure funzionano come previsto.
  • Perl : supporta paradigmi sia orientati agli oggetti che funzionali. È possibile ottenere un riferimento a una funzione denominata come $code_ref = \&function_name e chiamare tali riferimenti come $code_ref->(@arguments) , che equivale a function_name(@arguments) . Le chiamate ai metodi possono essere eseguite da un nome di runtime, in modo che $object->method() sia uguale a $name = "method"; $object->$name() . La risoluzione del metodo può essere eseguita per produrre un riferimento al codice come $code_ref = $object->can("method") . Sono supportate funzioni anonime: $code_ref = sub { ... } . Inoltre, l'operatore di chiamata di funzione può essere sovraccaricato per gli oggetti. Tutte le funzioni sono chiusure.

Non posso commentare C #, PHP e i vari dialetti BASIC.

    
risposta data 02.09.2014 - 16:27
fonte
2

Python

In Python, le funzioni sono oggetti di prima classe, quindi puoi passarli ad altre funzioni esattamente come qualsiasi altro argomento, senza alcuna sintassi speciale:

>>> def applier(f, x, y):
    return f(x, y)

>>> def add(x, y):
    return x + y

>>> applier(add, 1, 2)
3

Tutto ciò che è richiesto è che il primo argomento a applier sia un oggetto callable che prende due parametri.

Python supporta anche "piccole funzioni anonime" chiamate lambda espressioni , ma devono essere una singola espressione (si veda ad esempio Perché Python non consente i lambda multi-linea? ):

>>> applier(lambda x, y: x * y, 3, 4)
12
    
risposta data 12.04.2017 - 09:31
fonte

Leggi altre domande sui tag