Funzionale come prima lingua


Risposte:


16

Un grosso problema è che se inizi con una lingua come Haskell, tutto il resto sembrerà semplicemente scadente.

Onestamente penso che iniziare con un linguaggio come Haskell o uno schema sarebbe un'ottima idea.

(Ammetto di essere un drogato di linguaggio funzionale) EDIT:

OK cosa mi piace di entrambe le lingue:

Scheme prende un linguaggio molto semplice e ne costruisce un linguaggio meravigliosamente robusto per lo sviluppo. Anche SICP è scritto sullo schema che vale la pena imparare proprio lì. Lo schema riguarda la cosa più semplice che puoi immaginare che potrebbe essere un linguaggio completo.

Haskell Quello che sta davvero crescendo su di me è il sistema dei tipi. Quindi molti dei bug 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 infinite strutture di dati in Haskell e quindi creare solo la parte necessaria.


Ad essere onesti, un sacco di lingue stanno incorporando aspetti sempre più funzionali, quindi la vita non è così brutta come una volta.
Tikhon Jelvis,

È vero, e per qualcuno che ama FP non è altro che una buona cosa
Zachary K

3
Lo so - lo sto suggerendo come una buona ragione per imparare prima il PQ. È una tendenza che mi rende davvero felice da un po '.
Tikhon Jelvis,

In realtà non dice molto per rispondere alla domanda, perché ti piace Haskell (o Scheme)? Sarebbero buone come prime lingue per l'apprendimento? Perché?
jimwise

Aggiunti alcuni commenti su entrambe le lingue
Zachary K,

6

Il più grande vantaggio dell'apprendimento di un linguaggio funzionale prima di imparare un linguaggio OOP è che le tue abilità di programmazione vengono sviluppate per prime e quindi puoi facilmente afferrare i concetti di OOP. Se inizi direttamente con un linguaggio OOP dovrai imparare due cose contemporaneamente: "pensare al codice" e "pensare all'ODO". Può distrarre. Prima pratica con un linguaggio funzionale e sviluppa le tue capacità di programmazione. Quindi impara OOP e altri paradigmi. Poiché OOP è stato progettato per compensare le carenze della programmazione strutturale, sarà più facile capire perché. Questo è il motivo per cui i corsi CS iniziano con C e poi passano a C ++.


1
Nella mia università, abbiamo iniziato con un linguaggio funzionale, Standard ML e imparato quali sono gli effetti collaterali. Dopo di che abbiamo imparato il C ma non abbiamo mai imparato il C ++.
Jonas,

@Jonas. Immagino che diversi paesi / università abbiano strutture di corsi molto diverse. Nella mia università, C seguito da C ++ è uno standard per i corsi Engg di Comuter Science, ma per altri flussi di ingegneria, viene insegnato solo C.
DPD,

Alla mia università iniziamo con Java, quindi usiamo solo la lingua appropriata per i corsi successivi. Ad esempio, C / C ++ viene utilizzato per la programmazione dei sistemi, C # per l'interfaccia utente, vari linguaggi di assemblaggio per l'organizzazione dei computer e penso che qualunque cosa tu voglia per la programmazione di giochi
Carson Myers,

Nella mia università, abbiamo iniziato imparando Scheme (con SICP). Le prime settimane erano completamente funzionali; OOP è stato introdotto bene nel corso. Ho pensato che fosse tutto ben strutturato e mi è piaciuto molto il corso.
Tikhon Jelvis,

6

Sulla domanda su come imparare la programmazione partendo dalla programmazione funzionale, due raccomandazioni classiche:

  • Il primo e ovvio è la classica struttura e interpretazione dei programmi per computer , di Abelson e Sussman, che rimane una delle migliori introduzioni a CS là fuori, e viene insegnata da una prospettiva funzionale, usando Scheme. È disponibile interamente online . Se non inizi qui, dovresti arrivare qui come punto.

  • Un testo più recente che copre la maggior parte dello stesso terreno a 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 membri del team Racket / PLT, che utilizza il dialetto Racket di Schema. È anche disponibile online , così come la seconda edizione in corso . Questo libro ha il vantaggio di essere progettato per essere utilizzato con l'ambiente di programmazione DrRacket, che fornisce un'interfaccia molto intuitiva per principianti ed esperti allo scopo di sperimentare il codice.

Sulla questione del perché iniziare con la programmazione funzionale, vorrei sottolineare il blog di Bob Harper . Carnegie Mellon ha recentemente ritoccato il proprio curriculum CS per insegnare prima la programmazione funzionale e Harper ha seguito i suoi progressi passo dopo passo sul suo blog. Come uno dei ragazzi dietro la definizione di Standard ML, è ovvio che è per questa mossa e ne discute bene le ragioni.

Infine, metterei in guardia dall'apprendimento di Haskell prima, anche se altri potrebbero non essere d'accordo. Mentre il puro approccio di Haskell a FP genererà sicuramente buone abitudini, l'attenzione del linguaggio al calcolo pigro non è necessariamente una buona corrispondenza per il principiante; una delle prime e più importanti cose che dovrai imparare a fare come programmatore è di ragionare esattamente su ciò che il tuo programma sta facendo osservando la fonte e sul costo relativo di diversi approcci allo stesso problema. La mia esperienza è che la pigrizia di Haskell rende entrambe queste attività una sfida per i programmatori anche esperti, anche se Your Mileage May Vary.


5

Il principale vantaggio (o non svantaggio) di iniziare con FP è che la maggior parte dei concetti può applicarsi anche alla programmazione imperativa. Realm of Racket utilizza analogie di videogiochi per insegnare concetti sia funzionali che imperativi, e agli studenti dedicati viene lasciato non solo un gioco funzionale (npi), ma una solida comprensione di condizionali, ricorsione, loop, ADT e design guidato da eventi. Questi concetti sono praticamente onnipresenti nella programmazione moderna e sono usati costantemente.

Ancora più importante, tuttavia, è imparare a codificare le astrazioni , qualcosa in cui FP eccelle, con l'uso di funzioni e tipi di dati di ordine superiore. Come progettare i programmi adotta un approccio unico a questo insegnando attraverso l'induzione. Ad esempio, gli studenti imparano come foldfunziona osservando il codice per prendere sia la somma che il prodotto di un elenco, trovare ciò che hanno in comune e ricavarne l'implementazione.

L'equivalente OOP di quanto sopra implicherebbe probabilmente una o più delle seguenti: interfacce, classi astratte, generici, funzioni o singoli (se stai sbagliando). Mentre questi sono modelli di progettazione perfettamente accettabili in Java, IMHO non appartengono a un curriculum introduttivo e servono solo a offuscare i principi sottostanti. Anche se qualcuno che è stato introdotto alle lingue FP "in ritardo", posso dire che la navigazione nel mare in continua evoluzione di OOP è stata notevolmente semplificata grazie a un forte ancoraggio funzionale.


Quasi dimenticavo: se si desidera acquistare Regno della racchetta, provate questo coupon: RACKETEERS. Non sono sicuro quando scade, mi dispiace.
bug

+1 per menzionare le funzioni di ordine superiore: ero pronto a pubblicare la mia risposta su di esse. Metà dei miei collaboratori lottano con il concetto e gli altri che li ottengono non ci pensano quando sarebbe la soluzione più semplice.
Izkata,

1
Non avevo mai sentito parlare di Realm of Racket, ma dal titolo sapevo subito di cosa si trattava, perché il titolo è un riferimento al suo fratello maggiore, Land of Lisp.
Magus,

4

La programmazione funzionale rende le cose molto più semplici. Nelle lingue OOP, devi gestire la gestione dello stato su più thread senza rovinarlo. Nei linguaggi funzionali, quando la maggior parte del lavoro svolto è svolto da funzioni pure, non devi preoccuparti.

In termini di velocità / prestazioni, non sono un vero fantino delle prestazioni, ma essere funzionali 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 post-fact.

Quindi tutto dipende davvero da cosa stai cercando


2

Penso che la disponibilità di materiale didattico, alcuni esempi di codici validi e mentori siano molto importanti nell'apprendimento dei linguaggi di programmazione. A seconda della tua 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, questo non è un problema.


1
Penso che i tuoi presupposti siano sbagliati. Ci sono buoni tutorial, libri, documenti ecc. Su cose funzionali. Inoltre, ci sono molti documenti là fuori che trattano cose speciali come tipo di sistema, implementazione, macchine virtuali, calcolo lambda e così via.
Ingo,

1

Forse il motivo più importante per considerare l'apprendimento dei linguaggi di programmazione funzionale è la comprensione dei tipi di dati algebrici. La mappatura mentale aiuterà a modellare le relazioni di classe OO e persino la progettazione di 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 delle lingue lambda probabilmente vedrà un forte aumento nell'uso nei prossimi 1-2 decenni.

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

Quindi, impara 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 utili le lezioni FP del Dr. Erik Meijer , che si trovano su MSDN.

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.