Scheme vs Haskell per un'introduzione alla programmazione funzionale?

36

Mi trovo a mio agio con la programmazione in C e C # e esplorerò C ++ in futuro. Potrei essere interessato ad esplorare la programmazione funzionale come un paradigma di programmazione diverso. Lo sto facendo per divertimento, il mio lavoro non riguarda la programmazione di computer, e sono in qualche modo ispirato all'uso di programmazione funzionale, insegnato abbastanza presto, in corsi di informatica al college. Il calcolo lambda è certamente al di là delle mie capacità matematiche, ma penso di poter gestire la programmazione funzionale.

Quale di Haskell o Scheme servirebbe da buona introduzione alla programmazione funzionale? Uso emacs come editor di testo e vorrei poterlo configurare più facilmente in futuro, il che implicherebbe l'apprendimento di Emacs Lisp. La mia comprensione, tuttavia, è che Emacs Lisp è abbastanza diverso da Scheme ed è anche più procedurale rispetto a funzionale.

Probabilmente userò il libro "The Little Schemer", che ho già acquistato, se perseguirò Scheme (mi sembra un po 'strano per il mio limitato sfogliarlo). Oppure, se inseguirò Haskell, userò "Impara un Haskell per un grande bene". Guarderei anche i video Intro to Haskell del Dr Erik Meijer su Channel 9.

Qualsiasi suggerimento, feedback o input apprezzato.

Grazie.

P.S. Ho anche accesso a F # poiché ho Visual Studio 2010 che uso per lo sviluppo C #, ma non penso che dovrebbe essere il mio criterio principale per selezionare una lingua.

    
posta haziz 19.04.2011 - 00:52
fonte

12 risposte

27

Consiglierei OCaml.

Dal mio punto di vista personale, la base principale delle moderne programmazioni funzionali sono le funzioni di ordine superiore, un sistema di tipo statico, i tipi di dati algebrici e la corrispondenza dei modelli.

Tra una Schema, una ML e una Haskell, sceglierei la ML perché penso che sia la più rilevante per questa definizione. Scheme non ha una battitura statica (c'è Typet Racket, ma non è per i principianti dello schema), e Haskell ha troppe altre cose (monade, valutazione pigra ...) che, sebbene interessanti, possono distogliere l'attenzione dall'importante base .

SML e OCaml sono ugualmente interessanti; Sono più abituato a OCaml, e ha un sentimento più "pratico" che è bello (ma se vuoi davvero "pratico" il rischio di perdere la tua anima, puoi anche scegliere F #).

Scheme e Haskell sono anche lingue molto interessanti. L'enfasi dello schema sulle macro è interessante, ma non direttamente correlata alla programmazione funzionale (è un'altra delle cose al mondo che dovresti assolutamente provare, oltre alla programmazione logica, ai linguaggi basati sullo stack e alla E orientata alle capacità).

Haskell è sicuramente un ottimo linguaggio e, penso, un punto obbligato per gli aspiranti guru della programmazione funzionale. Ma siccome i linguaggi di base di OCaml e Haskell sono molto simili (eccetto per la valutazione pigra che distrae per il principiante), è facile imparare Haskell una volta che conosci le basi di OCaml. O meglio, puoi concentrarti sulle cose strane e non devi assimilare le basi allo stesso tempo.

Allo stesso modo, una volta che hai visto OCaml, e possibilmente anche Haskell, e vuoi ancora saperne di più, dovresti guardare a Coq o Agda. Eppure pochi raccomanderebbero Coq o Agda per una prima introduzione alla programmazione funzionale ...

Per chiarire il mio punto di vista: penso che imparando OCaml (o SML) allora Haskell ti renderà un buon programmatore funzionale come l'apprendimento diretto di Haskell, ma più facilmente (o meno dolorosamente).
Inoltre, OCaml e Haskell hanno entrambi delle buone cose che li differenziano ed è interessante conoscere le funzionalità avanzate di entrambi . Solo apprendere Haskell è più povero sotto questo aspetto (anche se ovviamente potresti imparare OCaml dopo Haskell, penso che sia meno logico e ti farà diventare più frustrato).

Per l'apprendimento di OCaml, consiglierei la bozza di libro di Jason Hickey (PDF) .

¹ questa definizione è controversa. Alcuni membri di Scheme dichiareranno che la digitazione statica non ha nulla a che fare con la programmazione funzionale. Alcune persone di Haskell sostengono che la loro definizione di purezza ("ciò che Haskell fa, ma non di più") è una condizione di sine qua non per essere un linguaggio funzionale. Accetto di non essere d'accordo.

    
risposta data 19.04.2011 - 11:53
fonte
26

Se sei interessato ai concetti più avanzati nella programmazione funzionale, allora vai con Haskell. Esiste un sistema di tipo corretto e un severo divieto di mutazione. Tuttavia, Haskell non è per i deboli di cuore.

Se vuoi solo un'introduzione al design funzionale, vai con Scheme. La sintassi è molto più facile da imparare e leggere. Permette la programmazione procedurale, ma ti limiti a non usare alcuna procedura con ! alla fine del nome.

Con Scheme, puoi anche leggere Structure and Interpretation of Computer Programs , che è la migliore introduzione ai paradigmi di programmazione, mani giù. Ci sono lezioni sul libro sia da MIT e Berkeley .

    
risposta data 19.04.2011 - 03:40
fonte
17

La risposta corretta è, ovviamente, entrambe! Quindi è solo una questione su quale linguaggio affrontare per primo. La mia situazione è identica alla tua. Mi è piaciuto molto The Little Schemer immensamente. Capirai sicuramente i costrutti di base della programmazione funzionale dopo averlo superato (e avere un posto dove mettere le tue gelatine!)

Sono circa un quarto in Learn You a Haskell per Great good. Mi sto divertendo un bel po ', ma i due libri non potrebbero essere più diversi. Learn You a Haskell ha un approccio molto tradizionale all'insegnamento di una lingua specifica. Il Little Schemer è specifico per Scheme, ovviamente, ma è molto più interessato all'insegnamento dei fondamenti della programmazione funzionale, non del linguaggio di Scheme.

Consiglio vivamente di iniziare con The Little Schemer. È meno pratico, ma più fondamentale.

    
risposta data 19.04.2011 - 00:59
fonte
17

I miei due centesimi rispetto alla programmazione funzionale sono quelli di non rimanere bloccati su una particolare lingua, ma di imparare i concetti chiave della programmazione funzionale. Ho imparato la programmazione funzionale buttandomi a capofitto in un progetto in cui il mio capo ha insistito affinché tutto lo sviluppo fosse fatto in APL. L'APL è un linguaggio di elaborazione dell'array funzionale ed è il più lontano possibile da LISP, Haskell o da qualsiasi altro linguaggio di programmazione mainstream. Il vero guadagno è stato quando ho scoperto che una volta che ho "borbottato" il paradigma di programmazione funzionale e imparato mentalmente come decomporre un problema in un programma funzionale, non ero più intimidito dagli aspetti idiomatici di altri linguaggi funzionali come Haskell, OCaml, Scheme, Scala e Clojure. Da allora ho avuto un bel po 'di successo nel venire a galla con altri linguaggi funzionali e ho scritto codice di qualità commerciale piuttosto buono in OCaml, Scala e SBCL.

Se dovessi scegliere una prima lingua funzionale, probabilmente sceglierei Haskell o Steel Bank Common Lisp (SBCL). Per Haskell, ho letto Learn You a Haskell ... , Real World Haskell , Haskell Road to Logic, Maths and Programming , e Perle dell'algoritmo funzionale . Per CL, ho letto Land of Lisp , Paradigms of Artificial Intelligence Programming e (se sei davvero hardcore) Let over Lambda . È possibile combinare tutti questi libri per ottenere un'ampia panoramica di approcci e concetti pratici di programmazione funzionale.

Prenderò in considerazione anche l'apprendimento di Clojure e Scala, in quanto entrambi sono linguaggi funzionali molto buoni e molto espressivi (indipendentemente da ciò che potrebbe dire il purificatore di FP).

    
risposta data 19.04.2011 - 02:27
fonte
6

C'è qualche ragione per cui ML non è una delle tue opzioni? C'è una buona quantità di materiale introduttivo disponibile, inclusi libri e dispense di corsi. Se ti piace The Little Schemer potresti anche goderti The Little MLer. Infine, puoi facilmente effettuare la transizione a F # più tardi. (Non che io stia battendo Haskell o Scheme - idealmente impari tutti e tre).

Inoltre, una parola di avvertimento su Emacs Lisp. Non penso che Haskell o ML ti prepareranno per questo. Un linguaggio Lispy come Scheme aiuterà ma ci sono ancora grandi differenze ad es. variabili con scope dinamiche. Le estensioni di Emacs, per la loro stessa natura, tendono ad essere più imperative che funzionali: si tratta di alterare lo stato dell'editor.

    
risposta data 19.04.2011 - 18:16
fonte
6

Scrivi te stesso uno schema in 48 ore (in haskell)

Lo consiglio vivamente. Imparerai Haskell usando un problema reale e interessante, e imparerai la migliore lezione di schema giocando con l'interprete che costruisci. Se segui questa strada, mantieni alcune buone presentazioni di Haskell in giro. Li capirai meglio se hai un problema da risolvere.

    
risposta data 19.04.2011 - 07:23
fonte
5

Sono d'accordo con il punto "apprendi entrambi", ma ci sono alcuni altri punti che non sono stati menzionati finora. Prima di tutto, se sei nuovo alla programmazione funzionale e vai con Haskell, allora devi affrontare molte cose nuove oltre a FP: devi imparare come vivere in un ambiente pigro che può richiedere uno sforzo considerevole, e hai bisogno di trattare un sistema di tipo "reale" che può essere molto lontano da quello che usi in C o C #.

Scheme, OTOH, ha una sintassi dall'aspetto estraneo, ma non esiste un sistema di tipo statico da imparare, ed è un linguaggio rigoroso, quindi le cose sono più familiari. Inoltre, le implementazioni di Scheme tendono ad essere molto malleabili - ad esempio, Racket lo porta ad un estremo e fornisce una variante lazy e staticamente uno digitato. Ciò significa che puoi iniziare con la roba "facile" e imparare a usare un linguaggio funzionale, e più tardi puoi crescere da solo e usare la variante tipizzata e quella pigra. Dovrebbero essere più facili ora, dal momento che si ha a che fare con una funzione alla volta. Per essere chiari, i concetti saranno abbastanza recenti che il problema sintattico sarà minore e per lo più irrilevante. In altre parole, una volta che inizi a conoscere i nuovi concetti, sarai abbastanza occupato da far scomparire la sintassi. (E se ti interessa davvero la sintassi, la sintassi di Haskell è qualcosa che considero molto elegante, ma è anche molto lontana dalla sintassi media C / C # / C ++.)

Ma avendo detto tutto ciò, penso che ci sia anche un buon punto per F # - tu dici che lo fai come una cosa secondaria, ma quando impari FP, vorrai presto usare tutta quella roba buona. Usare F # significa che puoi fare cose più "reali" dal momento che è probabilmente facile affrontare lo stesso tipo di problemi con cui lavori nel tuo lavoro diurno. Idealmente, arriverete ad un punto in cui vedreste il vantaggio di usarlo su, diciamo, C # e usarlo in qualche progetto. Quindi, mentre hai ragione a non scegliere F # solo perché è più facile per te accedere, dovresti considerarlo poiché non c'è niente di meglio che usando questi nuovi concetti. Al contrario, se usi Scheme o Haskell e lo consideri un linguaggio giocattolo per il tuo scopo (anche se sai che alcune persone lo usano per applicazioni reali), allora non prenderai mai troppo sul serio l'intera FP. [Ma YMMV, si basa principalmente su osservazioni soggettive e può variare notevolmente da persona a persona.]

    
risposta data 19.04.2011 - 04:57
fonte
4

Vorrei andare con Haskell. Nello schema, potresti essere spinto a fare cose procedurali, e il suo sistema di tipi non è altrettanto utile ha Haskell, che è grande per un principiante in quanto praticamente controlla che il tuo codice sia corretto durante la compilazione tempo.

    
risposta data 19.04.2011 - 01:16
fonte
1

Penso che sia facile rimanere intrappolati nei dibattiti sulle lingue e perdere il punto. Per qualcuno che vuole solo imparare che cosa è FP, le differenze tra Ocaml / ML / Scheme / Haskell non sono la metà importanti del tuo comfort con il materiale (libri, video, strumenti) che usi per impararlo. E se hai o meno un amico per aiutarti ad imparare in un certo modo, briscola tutto il resto.

    
risposta data 21.08.2012 - 09:08
fonte
0

Se non è puro, puoi usare anche un linguaggio imperativo, così Haskell.

    
risposta data 20.04.2012 - 01:57
fonte
0

In una delle risposte che hai ricevuto alla tua domanda, ho trovato questo link abbastanza interessante, perché ti dà aa gusto di Haskell e Schema.

Oltre a questo nifty link, ecco la mia opinione sulla tua domanda.

Se vieni da un background di programmazione imperativo, potresti finire col mettere un sacco di impegno nell'apprendimento della programmazione funzionale. Mi assicurerei che l'esperienza di apprendimento non fosse vuota. Quello è che puoi applicarlo al tuo lavoro attuale o successivo o che ti aiuterà in un altro modo.

Ci sono molte buone lingue là fuori. Il popolo della Scala avrebbe esaltato la loro lingua, così come lo sarebbero i Clojure e i CL. Persino Pythonistas rivendica la pigrizia. Altre persone che ti hanno risposto hanno suggerito ML. Amit Rathore che ha scritto Clojure in Action potrebbe suggerirti di imparare Haskell .

Hai menzionato Windows e F #. Questo ti aiuterà nella tua posizione attuale? Non so nulla di F #. È abbastanza funzionale? Te lo chiedo, perché IMHO Python ha costrutti funzionali, ma non è come programmare in Clojure.

Per riassumere, impara un linguaggio funzionale che sia "veramente" funzionale e in tal senso ha più senso per la tua situazione.

    
risposta data 27.08.2012 - 00:39
fonte
-2

Dal punto di vista di un principiante relativo, suggerisco di non iniziare con SICP se decidi di fare uno Scheme, a meno che la tua matematica non sia abbastanza matura. Il libro e i video sono pieni di sottigliezze e non sono affatto intuitivi per qualcuno che inizia.

    
risposta data 09.11.2016 - 21:31
fonte

Leggi altre domande sui tag