Funzionale come prima lingua

13

Quali sono alcuni vantaggi e svantaggi nell'apprendimento della programmazione funzionale prima di altri paradigmi?

    
posta yodie 04.05.2011 - 07:04
fonte

7 risposte

16

Uno dei problemi principali è che se inizi con un linguaggio come Haskell, tutto il resto sembrerà semplicemente scadente.

Onestamente penso che iniziare con un linguaggio come Haskell o lo schema sarebbe una grande idea.

(Ammetto di essere dipendente dalla lingua funzionale) EDIT:

OK quello che mi piace di entrambe le lingue:

Schema prende un linguaggio molto semplice e ne costruisce uno straordinariamente solido linguaggio per lo sviluppo. Anche SICP è scritto su uno schema che vale la pena apprendere proprio lì. Scheme è la cosa più semplice che potresti immaginare che potrebbe essere un linguaggio completo.

Haskell Ciò che sta veramente crescendo su di me è il sistema dei tipi. Così molti degli errori che vedo in altre lingue sono dovuti al tipo sbagliato che compare da qualche parte. In Haskell è quasi impossibile. Anche l'idea di un linguaggio pigro ha solo alcune cose interessanti che ne derivano. Ad esempio, è possibile creare strutture di dati infiniti in Haskell e quindi creare solo la parte di cui si ha bisogno.

    
risposta data 04.05.2011 - 08:41
fonte
6

Il più grande vantaggio di imparare un linguaggio funzionale prima di apprendere un lang OOP è che le tue abilità di programmazione si sviluppano prima e poi puoi facilmente cogliere i concetti di OOP. Se inizi immediatamente con un linguaggio OOP, dovrai imparare due cose simultaneamente: "pensare al codice" e "pensare all'OD". Può distrarsi. Prima pratica con un linguaggio funzionale e sviluppa le tue capacità di programmazione. Quindi impara OOP e altri paradigmi. Dal momento che OOP si è proposto di compensare le carenze nella programmazione strutturale, sarà più facile capire perché. Questo è il motivo per cui i corsi di CS iniziano con C e poi passano a C ++.

    
risposta data 04.05.2011 - 07:35
fonte
6

Sulla domanda di come imparare la programmazione iniziando con la programmazione funzionale, due consigli classici:

  • Il primo, ovvio, è il classico Struttura e interpretazione dei programmi per computer , di Abelson e Sussman, che rimane una delle migliori introduzioni a CS, e viene insegnato da una prospettiva funzionale, usando Scheme. È disponibile in versione completa online . Se non inizi qui, dovresti arrivare qui come punto.

  • Un testo più recente che copre la maggior parte dello stesso terreno ad un ritmo più delicato, e con una maggiore attenzione all'ingegneria del software è How to Design Programs , di Matthew Felleisen e un gruppo di altri dal team Racket / PLT, che utilizza il dialetto Racket di Scheme. È disponibile anche online , così come lo è in corso seconda edizione . Questo libro ha il vantaggio che è progettato per essere utilizzato con l'ambiente di programmazione DrRacket, che fornisce un'interfaccia molto amichevole sia per principianti che per esperti per sperimentare con il codice.

Sulla questione di perché iniziare con la programmazione funzionale, vorrei fare riferimento a Blog di Bob Harper . Carnegie Mellon ha recentemente riorganizzato il proprio curriculum CS per insegnare la programmazione funzionale in primo luogo, e Harper ha coperto i suoi progressi un po 'alla volta sul suo blog. Come uno dei ragazzi dietro la definizione di Standard ML, è ovvio che è per questa mossa, e ne discute le ragioni per bene.

Infine, vorrei evitare di imparare Haskell prima, anche se altri potrebbero non essere d'accordo. Anche se il puro approccio di Haskell alla FP creerà certamente buone abitudini, l'attenzione della lingua sul calcolo pigro non è necessariamente una buona corrispondenza per il principiante; una delle prime e più importanti cose che devi imparare a fare come programmatore è ragionare su esattamente cosa sta facendo il tuo programma osservando la fonte, e sul costo relativo di approcci diversi allo stesso problema. Ho la mia esperienza che la pigrizia di Haskell rende entrambe queste attività un po 'una sfida per programmatori esperti, anche se il tuo chilometraggio può variare.

    
risposta data 04.05.2011 - 16:11
fonte
5

Il principale vantaggio (o non svantaggio) dell'avvio di FP è che la maggior parte dei concetti può essere applicata anche alla programmazione imperativa. Realm of Racket utilizza analogie di videogiochi per insegnare concetti sia funzionali che imperativi, e gli studenti dedicati sono rimasti non solo con un gioco funzionale (npi), ma una solida conoscenza di condizionali, ricorsività, loop, ADT e progettazione guidata dagli eventi. Questi concetti sono praticamente onnipresenti nella programmazione moderna e vengono usati costantemente.

Ancora più importante, però, è l'apprendimento di come codificare le astrazioni , qualcosa in cui FP eccelle, con l'uso di funzioni e tipi di dati di ordine superiore. Come progettare programmi prende un approccio unico a questo insegnando attraverso l'induzione. Ad esempio, gli studenti apprendono come fold funzioni osservando il codice per prendere sia la somma che il prodotto di un elenco, trovando ciò che hanno in comune e derivando l'implementazione da soli.

L'equivalente OOP di quanto sopra implicherebbe probabilmente uno o più dei seguenti elementi: interfacce, classi astratte, generici, funtori o singleton (se lo stai facendo male). Sebbene questi siano modelli di progettazione perfettamente accettabili in Java, IMHO non appartengono a un programma di studio introduttivo e servono solo a nascondere i principi sottostanti. Anche se qualcuno che è stato introdotto nei linguaggi FP "tardi", posso dire che navigare nel sempre mutevole mare di OOP è stato reso molto più facile avendo una strong ancora funzionale.

    
risposta data 23.06.2013 - 04:07
fonte
4

La programmazione funzionale rende le cose molto più semplici. Nei linguaggi OOP, devi gestire lo stato di gestione su più thread senza rovinare quello stato. Nei linguaggi funzionali, quando la maggior parte del lavoro svolto viene svolto da funzioni pure, non devi preoccuparti di questo.

In termini di velocità / prestazioni, non sono un vero fantino per le prestazioni, ma essere funzionale non significa essere lenti, e la struttura dei linguaggi funzionali ha poco a che fare con la loro velocità. La sintassi dei linguaggi funzionali varia notevolmente come le differenze tra Clojure e Haskell. Clojure è molto veloce così com'è e può raggiungere (e talvolta superare) le velocità di Java con l'ottimizzazione dopo il fatto.

Quindi tutto dipende davvero da cosa stai cercando

    
risposta data 04.05.2011 - 07:21
fonte
2

Penso che la disponibilità di materiale didattico, alcuni esempi di codice e mentori siano molto importanti quando si imparano i linguaggi di programmazione. A seconda della situazione, potresti avere un mentore che può insegnarti, ecc., Ma penso che le risorse linguistiche funzionali siano molto poche rispetto alle lingue tradizionali. Significa che progredirai più lentamente rispetto all'apprendimento delle lingue tradizionali. Ma se non hai fretta, non è un problema.

    
risposta data 04.05.2011 - 07:18
fonte
1

Forse la ragione più importante per considerare l'apprendimento dei linguaggi di programmazione funzionale è la comprensione dei tipi di dati algebrici. La mappatura mentale aiuterà nella modellazione delle relazioni di classe OO e persino nella progettazione del database.

L'attenzione ai sistemi multi-core / multi-processore sottolinea l'uso di algoritmi paralleli che possono essere espressi in modo più chiaro e conciso in FP. Il ramo di lingue lambda vedrà probabilmente un strong aumento dell'uso nei prossimi due decenni.

Ma ci sono anche alcune insidie comuni. Credere che FP sia più semplice è un grosso errore, dal momento che calcolare la complessità di spazio e tempo e fornire prove di interruzione può essere molto più difficile nel calcolo lambda, specialmente nelle lingue che supportano la valutazione pigra.

Quindi, apprendi entrambi! O forse meglio: prima impara una lingua che abbraccia entrambi, come Scala. Se non ti dispiace t-shirt tie-die e un leggero accento olandese, forse troverai Lezioni FP di Dr. Erik Meijer utili, che sono su MSDN.

    
risposta data 04.05.2011 - 08:43
fonte