2013-06-03 16 views
9

Ho letto questo articolo: http://en.wikipedia.org/wiki/Function_pointer e sono un po 'confuso. Poiché i puntatori alle funzioni di supporto C/C++, non significa che supportano la programmazione funzionale in generale? Nota che in realtà non voglio usare C o C++ per la programmazione funzionale, ma sono curioso dal momento che non ho mai sentito che C o C++ supporti una cosa del genere. (So ​​che i compilatori per molti linguaggi di programmazione funzionale esistono in C, ma non è quello che intendo per "supporto").Programmazione funzionale in C/C++?

+0

@cdbitesky, penso che sia un po 'ingiusto. La domanda è relativamente precisa nel tentativo di accertare il ruolo dei puntatori di funzione nel consentire la programmazione funzionale in generale. Ovviamente possiamo cavillare un po 'sulle definizioni tecniche di "programmazione funzionale", ma penso di averlo affrontato nella mia risposta. – Gian

risposta

7

Modifica: Non sono sicuro del motivo per cui questa risposta diventa così tanto odio. La domanda si riferisce in particolare ai puntatori di funzione e se la loro presenza significa che C++ supporta "programmazione funzionale in generale".

In una sorta di tecnica, non molto utile: sì *. La vera essenza della programmazione "funzionale" è che le funzioni sono valori. C e C++ non ti daranno alcun aiuto in termini di cose come la facile creazione e distruzione di lexical closures, né ti farà alcun favore in termini di partial application. Il fatto che sia possibile simulare l'aspetto di funzioni che si comportano come valori usando i puntatori di funzione è in realtà solo una conseguenza dei linguaggi equivalenti di espressività. Cercando di confondere questo con la "programmazione funzionale", si sta veramente facendo strada nel sottosuolo di Turing.

* Per una distinzione davvero tecnica, C e C++ non hanno alcun valore . Un puntatore a funzione è distinto dal valore di una funzione, anche se sembrano simili se si strizza l'occhio.

+1

E i funtori? Sono il modo standard di usare l'STL. In C++ 11 hai dei lambda monomorfi e in C++ 14 hai dei lambda generici. – gnzlbg

+2

Puoi scegliere di interpretare la mia risposta come falsa per C++ 14. La domanda riguardava davvero i puntatori di funzione. – Gian

14

La programmazione funzionale (si prega di cercarlo se si è veramente interessati) ha poco a che fare con i puntatori di funzioni o la mancanza di essi.

C++ è un linguaggio multi-paradigma con una grande quantità di supporto per FP, in particolare le versioni successive. Molte persone che lavorano con WG21 come FP e spingono per il supporto. In C++ 11 abbiamo anche ottenuto il lambda e il debutto polimorfo di lambda in C++ 14. Questo copre molte cose. Mentre le funzioni restano di seconda classe, i cittadini lambda possono prendere il controllo.

Purtroppo la gestione della ricorsione in coda non è ancora obbligatoria, ma i compilatori effettivamente la gestiscono, e nell'ultimo decennio riportano anche "ricorsione infinita" quando si è incasinato il sovraccarico const. :)

Si può andare molto lontano usando lo stile FP in C++ e l'apprendimento aiuta a creare codice migliore anche quando si scelgono altri stili. Invito tutti a studiare SICP.

+0

Attualmente sto cercando di imparare OCaml in questo momento, che è ciò che ha portato alla mia esplorazione di Wikipedia e alla scoperta dei puntatori di funzione. Credo di aver saltato la pistola ponendo questa domanda senza capire veramente cosa sia ancora la programmazione funzionale. – user2258552

4

È possibile eseguire la programmazione funzionale in C++, sebbene la lingua non sia di aiuto. La programmazione funzionale del primo ordine, in cui si utilizzano semplicemente valori immutabili il più possibile, è certamente abbastanza semplice e, sebbene non esattamente facile, è possibile implementare lo standard monads!

Problemi correlati