L'apprendimento di un linguaggio funzionale rende un programmatore OOP migliore? [chiuso]

28

Come programmatore Java / C # / C ++ sento parlare molto dei linguaggi funzionali, ma non ho mai trovato il bisogno di impararne uno. Ho anche sentito che il più alto livello di pensiero introdotto nei linguaggi funzionali ti rende un programmatore di linguaggio OOP / procedurale migliore.

Qualcuno può confermarlo? In che modo migliora le tue capacità di programmazione?

Quale è una buona scelta di lingua da apprendere con l'obiettivo di migliorare le competenze in un linguaggio meno sofisticato?

    
posta GavinH 08.02.2011 - 01:31
fonte

6 risposte

32

I sono sostanzialmente d'accordo con la risposta di FrustratedWithFormsDesign , ma hai anche chiesto in che modo l'apprendimento del nuovo paradigma aiuta a sviluppare le proprie capacità. Posso dare un paio di esempi dalla mia esperienza.

Da quando apprendo la programmazione funzionale, sono molto più consapevole di quali concetti con cui lavoro sono più naturalmente considerati come "oggetti" (generalmente dove la mutazione ha senso) e che sono più naturalmente considerati come "valori" immutabili (penso che ci sia una distinzione importante, che tocca dove OO ha senso se FP ha senso, ma questa è solo la mia opinione).

Ho notato dove il mio codice include effetti collaterali, e sono più attento a isolare quei luoghi, rendendo più funzioni "pure" delle mie funzioni. Ciò migliora notevolmente la testabilità del mio codice OO.

Sono più consapevole dei cicli nella mia rappresentazione dei dati. (Ad esempio, non penso che tu possa scrivere una funzione per convertire una lista concatenata in una lista doppiamente collegata in Haskell, quindi ti accorgi di un ciclo un po 'più in quella lingua). Evitare i cicli riduce la quantità di sincronizzazione è necessario che le strutture dei dati siano coerenti internamente, riducendo il carico di condivisione di queste strutture tra i thread.

Sono più propenso a ricorrere alla ricorsione (i costrutti di loop ricorsivo dello schema sono cose di bellezza). Dijkstra ha toccato l'importanza di questo in Note sulla programmazione strutturata - gli algoritmi ricorsivi mappano molto direttamente all'induzione matematica, che egli suggerisce è l'unico mezzo per dimostrare intellettualmente i nostri anelli corretti. (Non suggerisco di provare il nostro codice corretto, ma più facilmente riusciremo a farlo da soli, più è probabile che il nostro codice sia corretto.)

Sono più propensi a utilizzare le funzioni di ordine superiore. Il documento di John Hughes, Perché la programmazione funzionale è importante . Sottolinea la composabilità ottenuta dall'utilizzo di tecniche di programmazione funzionale, le funzioni di ordine superiore svolgono un ruolo importante.

Inoltre, come accennato nella risposta di Jetti , scoprirai che molte idee FP sono state incorporato nei nuovi linguaggi OO. Ruby e Python forniscono entrambe molte funzioni di ordine superiore, ho sentito LINQ descritto come un tentativo di portare il supporto per le comprensioni monadiche in C #, anche il C ++ ora ha espressioni lambda.

    
risposta data 08.02.2011 - 05:16
fonte
32

Non direi che è garantito per farti diventare un programmatore OOP migliore, ma ti introdurrà a un nuovo modo di pensare, e che potrebbe renderti più bravo a risolvere i problemi in generale, non solo in termini di OOP.

    
risposta data 08.02.2011 - 01:46
fonte
12

Imparare un linguaggio funzionale - Lisp per me - aiuta davvero quando si creano applicazioni parallele. I metodi funzionali (basati sullo stato, senza effetti collaterali) sono molto più facili da sincronizzare e sono più facili da rendere thread-safe poiché dipendono solo dal loro input. Ciò significa che i soli dati che devi controllare per una determinata area di codice sono i parametri che inserisci. Ciò rende anche più facile il debug.

    
risposta data 08.02.2011 - 01:39
fonte
9

L'apprendimento di qualsiasi altro paradigma di programmazione migliorerà le tue capacità di programmazione in generale. La programmazione, quando non è roba da ricercatore accademico (e anche allora, spesso), è fondamentalmente una soluzione di problemi. Pensando, in una parola. I vari paradigmi sono modi diversi di pensare ai problemi e alle loro soluzioni. Quindi non pensarlo come "imparare un linguaggio funzionale". Pensala come "imparare un modo diverso di pensare ai problemi e alle loro soluzioni". Poi vedrai i benefici dell'apprendimento di una lingua anche se non la usi mai effettivamente.

Per rispondere alla tua domanda specifica, ero un programmatore C ++ ai tempi di yore (prima che ci fosse uno standard per C ++). Ho seguito tutte le solite cose con oggetti che mantenevano lo stato manipolato con metodi, ecc. Ecc. Ecc. Poi mi sono imbattuto in Haskell e ho imparato (molto) in esso. (Non penso che nessuno abbia mai veramente imparato Haskell.) L'esercizio sembrava un po 'perso al momento fino a quando uno dei miei colleghi, il tester assegnato al mio gruppo, fece un commento fuori mano che il mio codice stava diventando più facile da testare.

Quello che era successo era che avevo iniziato a rendere i miei oggetti sempre più immutabili. Le classi con stato mutabile complesso sono state rimpiazzate da classi che si sono clonate con le modifiche, restituendo i nuovi oggetti. Gli oggetti condivisi iniziarono a essere rimpiazzati da oggetti che avevano una semantica copy-on-write (dando così l'illusione di molti cloni oggetto senza l'overhead della memoria). Le funzioni non hanno avuto effetti collaterali se non assolutamente necessario; la pura e matematica definizione di "funzione" era sempre più la norma. Tutto ciò ha avuto inizio nel mio codice in modo naturale - nessun pensiero cosciente è stato coinvolto - mentre esploravo sempre più spazio di programmazione funzionale.

Ora faccio l'obiettivo di imparare almeno un nuovo paradigma di programmazione ogni due anni (anche se è solo un paradigma di estensione minore come AOP) e almeno due nuovi linguaggi all'interno di ogni paradigma (uno più puro possibile, uno più ibrido / pratica). Ognuno mi ha dato nuovi strumenti intellettuali da applicare a tutti i miei programmi in qualsiasi lingua, quindi il tempo trascorso per apprenderli non è, a mio avviso, nemmeno leggermente sprecato.

    
risposta data 08.02.2011 - 12:07
fonte
3

L'ho già detto e lo ripeto, l'apprendimento dei linguaggi funzionali ha decisamente migliorato il mio C #. Mi ha aiutato a capire lambda (e mi ha aiutato ad amarli). Mi ha anche reso conto di quanto preferisco la programmazione funzionale (F #) quando si lavora con le operazioni asincrone!

    
risposta data 08.02.2011 - 02:45
fonte
3

Il codice macchina non è altro che un elenco di effetti collaterali - comandi che vengono eseguiti direttamente dal processore. Gli effetti collaterali in C sono diversi, piuttosto che gestire i registri e l'hardware fisico, trattare un insieme di astrazioni e lasciare che il compilatore faccia tutto il lavoro sporco. C ti consente anche di strutturare i tuoi effetti collaterali nei loop e se poi le dichiarazioni. C ++ migliora su C aggiungendo OOP e alcune funzioni molto necessarie alla lingua. Java e C # aggiungono la garbage collection e Python aggiunge una digitazione dinamica.

Anche con tutte queste funzionalità - la digitazione dinamica, la garbage collection, ecc. i programmi in queste lingue sono ancora interamente basati su effetti collaterali. I linguaggi di programmazione funzionale, come Scheme, Clojure, Haskell e ML, sono qualcosa di completamente diverso, queste lingue sono più vicine alla matematica che al codice macchina. Piuttosto, usando gli effetti collaterali si passano i valori attorno alle funzioni.

What is a good choice of language to learn with the goal of improving skills in a less sophisticated language?

Raccomando Schema , è minimo ed è stato utilizzato nelle vecchie classi introduttive di programmazione del MIT. Gli altri linguaggi di programmazione funzionale sono molto più difficili da imparare. Clojure porta con sé tutte le complessità di Java, ML porta con sé un complicato sistema di tipi statici, Haskell è a volte indicato come un linguaggio accademico - non è l'ideale per i principianti, e così via. Il programma d'altra parte è facile da imparare e capire.

In what ways does it improve your programming skills?

Quasi tutti i linguaggi di programmazione di alto livello hanno funzioni e ricorsione: i concetti su cui si basa la programmazione funzionale. In quanto tale, la tua conoscenza di FP dovrebbe essere utile quasi ovunque, tuttavia, se vuoi davvero programmare in modo funzionale, dovresti usare un linguaggio in cui è naturale ed efficiente piuttosto che cercare di piegare il linguaggio di qualcun altro a tuo piacimento, vale a dire dovresti usare un linguaggio di programmazione funzionale per fare programmazione funzionale.

    
risposta data 08.02.2011 - 10:16
fonte

Leggi altre domande sui tag