Il codice risultante dai linguaggi funzionali utilizza molte funzioni che si vedono in gradi diversi nelle lingue non funzionanti. La raccolta dei rifiuti è passata all'utilizzo generale. L'ottimizzazione della chiamata di coda è done in GCC and VC++.
Le chiusure, tuttavia, sono un segno distintivo della programmazione funzionale. Non si vede l'uno senza l'altro. Se definisci i "linguaggi funzionali" per riferirsi solo ai linguaggi funzionali puri, i due non sono sinonimi di chiusure in linguaggi imperativi che supportano la programmazione funzionale (ad es. Javascript e Scheme (che è tecnicamente imperativo, sebbene il paradigma funzionale sia quello per lo più Usato)). Le chiusure potrebbero essere implementate con uno spaghetti stack per lo stack di chiamate o copiando le variabili locali quando si esce da uno stack frame o allocando variabili locali sull'heap e lasciando che la garbage collection si occupi di esse.
Una volta terminate le chiusure, le funzioni anonime sono relativamente facili (con un interprete, sono davvero facili). Con un compilatore, la funzione viene convertita in bytecode in fase di compilazione e il bytecode (piuttosto l'indirizzo del punto di ingresso) viene associato in fase di runtime all'ambiente corrente.
La composizione delle funzioni può fare affidamento sulla funzione anonima. Quando un compilatore incontra un operatore di composizione di funzioni f . g
, crea una funzione anonima che chiama i due argomenti f
e g
, passando il risultato di uno come argomento all'altro.
Le Monade possono essere implementate in lingue OO, non sono tanto necessarie quanto in lingue puramente funzionali.Le monade I/O non sono niente di speciale, si basano solo sul fatto che la piattaforma sottostante consente effetti collaterali.
Solo nitpick: non definirei FP come un "nuovo paradigma" ... (solo leggermente più popolare di prima forse) –