Iniziare con Haskell

Per alcuni giorni ho cercato di riprendere il paradigma della programmazione funzionale in Haskell. L’ho fatto leggendo i tutorial e guardando gli screencast, ma in realtà non sembra proprio nulla. Ora, nell’apprendimento di vari linguaggi imperativi / OO (come C, Java, PHP), gli esercizi sono stati un buon modo per me di andare. Ma poiché non so davvero di cosa sia capace Haskell e perché ci sono molti nuovi concetti da utilizzare, non so da dove iniziare.

Allora, come hai imparato Haskell? Cosa ti ha fatto davvero “rompere il ghiaccio”? Inoltre, qualche buona idea per gli esercizi iniziali?

Ordinerò questa guida con il livello di abilità che hai in haskell, passando da un principiante assoluto fino ad un esperto. Nota che questo processo richiederà molti mesi (anni?), Quindi è piuttosto lungo.

Principiante assoluto

Innanzitutto, haskell è capace di tutto, con abbastanza abilità. È molto veloce (dietro solo c e c ++ nella mia esperienza), e può essere usato per qualsiasi cosa, dalle simulazioni ai server, guis e applicazioni web.

Tuttavia ci sono alcuni problemi che sono più facili da scrivere per un principiante in haskell rispetto ad altri. I problemi matematici e i programmi di elaborazione delle liste sono buoni candidati per questo, in quanto richiedono solo la più elementare conoscenza di haskell per essere in grado di scrivere.

In primo luogo, alcune buone guide per imparare le basi di haskell sono il felice tutorial di haskell e i primi sei capitoli di apprendimento di haskell . Durante la lettura di questi, è una buona idea anche risolvere semplici problemi con quello che sai.

Altre due buone risorse sono Haskell Programming dai primi principi e Programming in Haskell . Entrambi vengono con esercizi per ogni capitolo, quindi hai piccoli problemi semplici che corrispondono a ciò che hai appreso nelle ultime pagine.

Una buona lista di problemi da provare è la pagina dei problemi di haskell 99 . Questi iniziano in modo molto semplice e diventano più difficili man mano che procedi. È una buona pratica fare un sacco di quelle, poiché ti permettono di mettere in pratica le tue abilità in ricorsione e funzioni di ordine superiore. Vorrei raccomandare di saltare tutti i problemi che richiedono casualità in quanto è un po ‘più difficile in haskell. Controlla questa domanda SO nel caso tu voglia testare le tue soluzioni con QuickCheck (vedi Intermedio sotto).

Una volta che ne hai fatto alcuni, potresti passare ad alcuni dei problemi di Project Euler . Questi sono ordinati in base al numero di persone che li hanno completati, il che è un’indicazione abbastanza buona di difficoltà. Questi testano la tua logica e haskell più dei problemi precedenti, ma dovresti comunque riuscire a fare i primi. Un grande vantaggio che haskell ha con questi problemi è che gli Integers non hanno dimensioni limitate. Per completare alcuni di questi problemi, sarà utile aver letto i capitoli 7 e 8 di imparare anche un haskell.

Principiante

Dopodiché dovresti avere una buona padronanza delle funzioni di ricorsione e ordine superiore, quindi sarebbe un buon momento per iniziare a fare altri problemi del mondo reale. Un ottimo punto di partenza è Real World Haskell (libro online, puoi anche acquistare una copia cartacea). Ho trovato i primi capitoli introdotti troppo in fretta per qualcuno che non ha mai praticato la ricorsione funzionale in passato. Comunque con la pratica che avresti dovuto fare dai precedenti problemi dovresti trovarla perfettamente comprensibile.

Lavorare attraverso i problemi del libro è un ottimo modo per imparare come gestire le astrazioni e build componenti riutilizzabili in haskell. Questo è vitale per le persone abituate alla programmazione orientata agli oggetti (oo), poiché i normali metodi di astrazione oo (classi oo) non appaiono in haskell (haskell ha classi di tipi, ma sono molto diversi dalle oo classi, più come interfacce oo ). Non penso che sia una buona idea saltare i capitoli, poiché ognuno introduce molte nuove idee che vengono utilizzate nei capitoli successivi.

Dopo un po ‘arriverete al capitolo 14, il temuto capitolo delle monadi (dum dum dummmm). Quasi tutti quelli che imparano haskell hanno difficoltà a comprendere le monadi, a causa di quanto sia astratto il concetto. Non riesco a pensare ad alcun concetto in un’altra lingua che sia astratto come le monadi sono nella programmazione funzionale. Monade consente a molte idee (come operazioni di I / O, calcoli che potrebbero fallire, analisi, …) di essere unificate sotto un’unica idea. Quindi non sentirti scoraggiato se dopo aver letto il capitolo delle monadi non li capisci davvero. Ho trovato utile leggere molte diverse spiegazioni delle monadi; ognuno dà una nuova prospettiva sul problema. Ecco un ottimo elenco di tutorial di monad . Consiglio vivamente l’ All About Monads , ma anche gli altri sono buoni.

Inoltre, ci vuole un po ‘prima che i concetti affondino davvero. Ciò avviene attraverso l’uso, ma anche nel tempo. Trovo che a volte dormire su un problema aiuta più di ogni altra cosa! Alla fine, l’idea farà clic e ti chiederai perché hai faticato a capire un concetto che in realtà è incredibilmente semplice. È fantastico quando succede, e quando lo fa, potresti trovare haskell il tuo linguaggio di programmazione imperativo preferito 🙂

Per assicurarti di capire perfettamente il sistema di tipo Haskell, dovresti provare a risolvere 20 esercizi di haskell intermedi . Quegli esercizi usano nomi divertenti di funzioni come “furry” e “banana” e ti aiutano ad avere una buona comprensione di alcuni concetti base di programmazione funzionale se non li hai già. Bel modo di passare la serata con un elenco di carta ricoperto di frecce, unicorni, salsicce e banane pelose.

Intermedio

Una volta compreso Monads, penso che tu abbia compiuto il passaggio da un programmatore di haskell per principianti a un haskeller intermedio. Quindi dove andare da qui? La prima cosa che consiglierei (se non li hai già imparati dall’apprendimento delle monadi) sono i vari tipi di monadi, come Reader, Writer e State. Ancora una volta, il mondo reale haskell e Tutto sulle monadi fornisce una grande copertura di questo. Per completare l’apprendimento della formazione monad sui trasformatori monad è d’obbligo. Questi ti permettono di combinare diversi tipi di Monade (come un Reader e una Monade di Stato) in uno solo. Questo può sembrare inutile per cominciare, ma dopo averli usati per un po ‘ti chiedi come hai vissuto senza di loro.

Ora puoi finire il libro di haskell del mondo reale, se vuoi. Saltare ora i capitoli non ha molta importanza, a patto che le monadi siano in picchiata. Basta scegliere ciò che ti interessa.

Con le conoscenze che avresti ora, dovresti essere in grado di usare la maggior parte dei pacchetti sulla cabala (anche quelli documentati almeno …), così come la maggior parte delle librerie che vengono con haskell. Un elenco di librerie interessanti da provare sarebbe:

  • Parsec : per analizzare programmi e testo. Molto meglio dell’uso delle espressioni regolari. Ottima documentazione, ha anche un capitolo di haskell nel mondo reale.

  • Quickcheck : un programma di test molto interessante. Quello che fai è scrivere un predicato che dovrebbe sempre essere vero (es. length (reverse lst) == length lst ). Quindi si passa il predicato al quickCheck e genererà un sacco di valori casuali (in questo caso gli elenchi) e si verificherà che il predicato sia vero per tutti i risultati. Vedi anche il manuale online .

  • HUnit : test unitario in haskell.

  • gtk2hs : Il framework gui più popolare per haskell, ti consente di scrivere applicazioni gtk in haskell.

  • happstack : un framework di sviluppo web per haskell. Non utilizza database, ma un archivio di tipi di dati. Documenti abbastanza buoni (altri framework popolari sarebbero istantanei e yesod ).

Inoltre, ci sono molti concetti (come il concetto di Monade) che dovresti eventualmente imparare. Questo sarà più facile che imparare Monads la prima volta, poiché il tuo cervello sarà abituato ad affrontare il livello di astrazione coinvolto. Una panoramica molto buona per conoscere questi concetti di alto livello e come si integrano è la Typeclassopedia .

  • Applicativo: un’interfaccia come Monads, ma meno potente. Ogni Monade è Applicativa, ma non viceversa. Questo è utile in quanto vi sono alcuni tipi che sono Applicative ma non sono Monade. Inoltre, il codice scritto usando le funzioni Applicative è spesso più componibile rispetto alla scrittura del codice equivalente usando le funzioni di Monad. Vedi Funcitors, Applicative Functors and Monoids dal learn you una guida haskell.

  • Pieghevole , Trasportabile: Typeclasss che astraggono molte delle operazioni degli elenchi, in modo che le stesse funzioni possano essere applicate ad altri tipi di contenitori. Vedi anche la spiegazione wiki di haskell .

  • Monoid : Un Monoid è un tipo che ha un valore zero (o mempty), e un’operazione, notata <> che unisce insieme due Monoid, in modo che x <> mempty = mempty <> x = x e x <> (y <> z) = (x <> y) <> z . Queste sono chiamate leggi di identity framework e associatività. Molti tipi sono mono, come i numeri, con mempty = 0 e <> = + . Questo è utile in molte situazioni.

  • Frecce : le frecce rappresentano un modo per rappresentare i calcoli che accettano un input e restituiscono un risultato. Una funzione è il tipo più semplice di freccia, ma ci sono molti altri tipi. La libreria ha anche molte funzioni molto utili per manipolare le frecce – sono molto utili anche se usate solo con semplici vecchie funzioni haskell.

  • Array : i vari array mutabili / immutabili in haskell.

  • ST Monad : ti permette di scrivere codice con uno stato mutabile che funziona molto rapidamente, pur rimanendo puro fuori dalla monade. Vedi il link per maggiori dettagli.

  • FRP: Functional Reactive Programming, un nuovo modo sperimentale di scrivere codice che gestisce eventi, trigger, input e output (come un gui). Non ne so molto di questo però. Il discorso di Paul Hudak su yampa è un buon inizio.

Ci sono molte nuove funzionalità linguistiche che dovresti dare un’occhiata. Li elenco solo, puoi trovare molte informazioni su di loro da google, haskell wikibook , il sito haskellwiki.org e la documentazione ghc .

  • Classi di tipi multiparametrici / dipendenze funzionali
  • Digitare famiglie
  • Tipi quantificati in modo esistenziale
  • Tipi di fantasmi
  • GADTS
  • altri…

Un sacco di haskell si basa sulla teoria delle categorie , quindi potresti volerlo esaminare. Un buon punto di partenza è la teoria delle categorie per informatico . Se non vuoi comprare il libro, anche l’ articolo correlato all’autore è eccellente.

Infine, vorrai saperne di più sui vari strumenti di haskell. Questi includono:

  • ghc (e tutte le sue caratteristiche)
  • cabal : il sistema di pacchetti haskell
  • darcs : un sistema di controllo della versione distribuito scritto in haskell, molto popolare per i programmi haskell.
  • eglefino : un generatore di documentazione automatica haskell

Mentre apprendi tutte queste nuove librerie e concetti, è molto utile scrivere un progetto di dimensioni moderate in haskell. Può essere qualsiasi cosa (ad esempio un piccolo gioco, un analizzatore di dati, un sito Web, un compilatore ). Lavorare su questo ti permetterà di applicare molte delle cose che stai imparando ora. Rimani a questo livello per secoli (questo è il posto in cui mi trovo).

Esperto

Ci vorranno anni per arrivare a questo stadio (ciao dal 2009!), Ma da qui suppongo che tu inizi a scrivere phd papers, nuove estensioni ghc e a inventare nuove astrazioni.

Ottenere aiuto

Infine, mentre in qualsiasi fase dell’apprendimento, ci sono più posti per ottenere informazioni. Questi sono:

  • il canale #haskell irc
  • le mailing list . Questi sono vale la pena iscriversi solo per leggere le discussioni che si svolgono – alcuni sono molto interessanti.
  • altri luoghi elencati nella home page di haskell.org

Conclusione

Bene, questo si è rivelato più lungo di quanto mi aspettassi … Comunque, penso che sia una buona idea diventare esperti in haskell. Ci vuole molto tempo, ma questo è principalmente perché stai imparando un modo completamente nuovo di pensare facendo così. Non è come imparare il ruby dopo aver imparato java, ma come imparare java dopo aver imparato c. Inoltre, sto scoprendo che le mie capacità di programmazione orientate agli oggetti sono migliorate come risultato dell’apprendimento di haskell, poiché sto vedendo molti nuovi modi di astrarre le idee.

Qualche mio collega ha avuto una buona esperienza con Learn You a Haskell for Great Good! .

Tutorial rivolto a persone che hanno esperienza in linguaggi di programmazione imperativi ma che non hanno ancora programmato in un linguaggio funzionale.

E controlla anche qui le risposte

Ecco un buon libro che puoi leggere online: Real World Haskell

La maggior parte dei programmi Haskell che ho fatto sono stati per risolvere i problemi di Project Euler .

Una volta un consiglio che ho letto non molto tempo fa era che dovresti avere una serie standard di semplici problemi che sai come risolvere (in teoria) e poi ogni volta che cerchi di imparare una nuova lingua, attui quei problemi in quella lingua.

Mi è piaciuto guardare questa serie di 13 episodi sulla programmazione funzionale usando Haskell.

Conferenze C9: Dr. Erik Meijer – Fondamenti di programmazione funzionale: http://channel9.msdn.com/shows/Going+Deep/Lecture-Series-Erik-Meijer-Functional-Programming-Fundamentals-Chapter-1/

Per aggiungere le risposte degli altri – ce n’è uno utile che ti aiuterà durante la codifica (ad esempio quando risolvi i problemi del progetto Eulero): Hoogle . È ansible utilizzare l’interfaccia della riga di comando o l’ interfaccia web .

Riga di comando

Dopo aver installato la piattaforma Haskell, assicurati di cabal install hoogle

Esempio di utilizzo di Hoogle:

Hai una funzione fx = 3 * x + 1 e vuoi applicarla su (5 :: Int) , quindi applicarla sul risultato e su quel risultato e così via e ottenere una lista infinita di quei valori. Sospetti che ci possa già esistere una funzione per aiutarti (non specificamente per la tua f ).

Quella funzione sarebbe di tipo (a -> a) -> a -> [a] se prende f 5 o a -> (a -> a) -> [a] se prende 5 f (assumiamo la funzione è per i tipi generali e non solo per Int s)

 $ hoogle "a -> (a -> a) -> [a]" Prelude iterate :: (a -> a) -> a -> [a] 

sì, la funzione che hai bisogno esiste già e si chiama iterate . lo usi per iterate func 5 !

interfaccia web

Il risultato per lo stesso esempio può essere trovato qui .

La programmazione di Graham Hutton in Haskell è concisa, ragionevolmente approfondita, ei suoi anni di insegnamento che Haskell mostra davvero. È quasi sempre quello che consiglio di iniziare, indipendentemente da dove vai da lì.

In particolare, il Capitolo 8 (“Functional Parser”) fornisce le basi reali di cui hai bisogno per iniziare a gestire le monadi e penso sia di gran lunga il miglior punto di partenza, seguito da All About Monads . (Riguardo a quel capitolo, tuttavia, si noti l’errata del sito Web, tuttavia: non è ansible utilizzare il modulo di do senza un aiuto speciale. Si potrebbe voler prima imparare a conoscere i typeclass e risolvere il problema da soli.)

Questo è raramente enfatizzato dai principianti di Haskell, ma vale la pena di imparare abbastanza presto non solo sull’uso delle monadi, ma sulla costruzione del proprio. Non è difficile, e quelli personalizzati possono rendere una serie di compiti piuttosto semplici.

Non cercare di leggere tutti i tutorial di Monad con divertenti metafore. Ti faranno confondere ancora peggio.

Suggerirei di unirmi al canale #haskell irc e di porre domande lì. È così che ho imparato Haskell. Se attraversi Real World Haskell come suggerito sopra, le risposte in tempo reale alle tue domande ti saranno di grande aiuto. Un sacco di persone intelligenti su #haskell scrivono Haskell per divertimento e per scopo di lucro, quindi riceverai molti buoni input. Provalo!

Questi sono i miei preferiti

Haskell: programmazione funzionale con tipi

 Joeri van Eekelen, et al. | Wikibooks Published in 2012, 597 pages 

Real World Haskell

  B. O'Sullivan, J. Goerzen, D. Stewart | OReilly Media, Inc. Published in 2008, 710 pages 

Posso inoltre raccomandare ancora un altro tutorial Haskell come introduzione.

Un’altra buona risorsa di apprendimento (probabilmente a livello intermedio), che mi ha aiutato molto e non è stata menzionata nelle altre risposte, per quanto posso vedere, è la Typeclassopedia di Brent Yorgey , che può essere trovata in The Monad Reader (Numero 13)

È scritto in uno stile molto accessibile e contiene (tra molte altre cose) il seguente consiglio introduttivo:

Ci sono due chiavi per la saggezza di un esperto hacker di Haskell:

  1. Capire i tipi.

  2. Ottieni un’intuizione profonda per ogni class di tipi e la sua relazione con altre classi di tipi, supportata dalla familiarità con molti esempi.

Lo stesso Reader di Monade è un vero tesoro per i programmatori funzionali (non solo i programmatori Haskell).

Prova a scrivere programmi facili in esso.

È ansible trovare attività di esempio in vari libri di testo, probabilmente.

Non consiglierei di attenersi ai libri di testo Haskell / FP, basta provare a fare cose semplici con esso: calcoli, manipolazioni di stringhe, accesso ai file.

Dopo aver risolto una dozzina, ho rotto il ghiaccio 🙂

Dopodiché, leggi molto sui concetti avanzati (Monade, frecce, IO, strutture dati ricorsive), perché haskell è infinito e ce ne sono molti.

Penso che la realizzazione della funzionalità di Haskell tramite gli esempi sia il modo migliore per iniziare soprattutto.

http://en.wikipedia.org/wiki/Haskell_98_features

Ecco le classificazioni difficili comprese le monadi e le frecce

http://www.haskell.org/haskellwiki/Typeclassopedia

per problemi del mondo reale e progetti più grandi, ricordate questi tag: GHC (compilatore più utilizzato), Hackage (libraryDB), Cabal (sistema di costruzione), darcs (un altro sistema di costruzione).

Un sistema integrato può farti risparmiare tempo: http://hackage.haskell.org/platform/

il database dei pacchetti per questo sistema: http://hackage.haskell.org/

Wiki del compilatore GHC: http://www.haskell.org/haskellwiki/GHC

Dopo Haskell_98_features e Typeclassopedia, penso che tu possa già trovare e leggere il documentario su di loro da solo

A proposito, potresti provare l’estensione dei linguaggi di GHC che potrebbe far parte dello standard di haskell in futuro.

questo è il mio modo migliore per imparare haskell. Spero possa aiutarti.

Ti suggerisco di iniziare prima leggendo il tutorial di BONUS , e poi leggendo Real World Haskell (online gratuitamente) . Unisciti al canale IRC #Haskell, su irc.freenode.com , e fai domande. Queste persone sono assolutamente newbie friendly e mi hanno aiutato molto nel tempo. Inoltre, proprio qui su SO è un ottimo posto per ottenere aiuto con cose che non puoi afferrare! Cerca di non scoraggiarti, una volta che clicca, la tua mente sarà saltata.

Il tutorial di BONUS ti farà impazzire e ti preparerà per il brivido che porta il Real World Haskell. Ti auguro buona fortuna!

Se hai solo esperienza con le lingue imperative / OO, ti suggerisco di usare un linguaggio funzionale più convenzionale come trampolino di lancio. Haskell è molto diverso e devi capire un sacco di concetti diversi per arrivare ovunque. Suggerisco di affrontare prima un linguaggio in stile ML (come ad esempio F #).

La prima risposta è molto buona. Per raggiungere il livello di esperti, dovresti fare un dottorato con alcuni degli esperti stessi.

Ti suggerisco di visitare la pagina di Haskell: http://haskell.org . Lì hai un sacco di materiale e molti riferimenti alla roba più aggiornata in Haskell, approvata dalla comunità Haskell.