Le funzioni di ordine superiore forniscono più potenza alla programmazione funzionale?


13

Ho fatto una domanda simile su cstheory.SE .

Secondo questa risposta su Stackoverflow esiste un algoritmo che su un linguaggio di programmazione funzionale puro non pigro ha una complessità , mentre lo stesso algoritmo nella programmazione imperativa è . L'aggiunta di pigrizia al linguaggio FP renderebbe l'algoritmoΩ(nlogn)Ω(n)Ω(n) .

Esiste una relazione equivalente che confronta un linguaggio FP con e senza funzioni di ordine superiore? È ancora Turing completo? Se lo è, la mancanza di ordine superiore su FP rende la lingua meno "potente" o efficiente?


Quale lingua FP?
reinierpost,

Le funzioni di ordine superiore e la valutazione pigra non sono la stessa cosa. Qual è la tua domanda?
Raffaello

Risposte:


11

In un linguaggio di programmazione funzionale abbastanza potente (ad esempio, con tipi di dati per implementare le chiusure ) è possibile eliminare tutti gli usi di ordine superiore mediante la trasformazione della defunzionalizzazione . Poiché questo metodo viene utilizzato per compilare questo tipo di linguaggio, si può ragionevolmente supporre che ciò non influisca sulle prestazioni e che in questa impostazione un ordine superiore non renda il linguaggio meno potente. Tuttavia influisce su come scrivere il codice.

Tuttavia, se la lingua non è abbastanza potente, allora sì, un ordine superiore fornisce potere espressivo. Considera il lambda-calcolo: senza alcuna funzione di ordine superiore, non può davvero fare nulla, soprattutto perché i tipi di dati più elementari (numeri interi, booleani) sono implementati usando le funzioni.

In conclusione, dipende davvero dalla lingua.


Sopra è la mia risposta. Di seguito, un commento su una solita ipotesi sulle lingue imperative.

su un algoritmo che su un linguaggio di programmazione funzionale non pigro ha una complessità , mentre lo stesso algoritmo nella programmazione imperativa è Ω ( n ) . L'aggiunta della pigrizia al linguaggio FP renderebbe l'algoritmo Ω ( n ) .Ω(nlogn)Ω(n)Ω(n)

nO(1)O(logn)O(logm)mmnmn

O(1)


4

Dipende da cosa intendi per espressività.

Ecco un argomento secondo cui l'ordine superiore aggiunge qualcosa: con le lingue del primo ordine, la ricorsione primitiva non è sufficiente per esprimere la funzione di Ackermann . Tuttavia, in presenza di funzioni di ordine superiore, è sufficiente la ricorsione primitiva:

Ackermann 0=λX.X+1Ackermann (m+1)=Iter (Ackermann m)Iter f 0=f 1Iter f (n+1)=f (Iter f n)

Questo definisce la funzione di Ackermann usando solo la ricorsione primitiva.

IterIterNKNKIter(NN)(NN)

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.