Ordinerò questa guida per il livello di abilità che hai in Haskell, passando da un principiante assoluto fino a un esperto. Nota che questo processo richiederà molti mesi (anni?), Quindi è piuttosto lungo.
Principiante assoluto
Innanzitutto, Haskell è capace di tutto, con sufficiente abilità. È molto veloce (dietro solo C e C ++ nella mia esperienza) e può essere utilizzato per qualsiasi cosa, dalle simulazioni ai server, alle guide e alle 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, poiché richiedono solo le conoscenze di base di Haskell per poter scrivere.
In primo luogo, alcune buone guide per apprendere le basi di Haskell sono il felice tutorial di haskell e i primi 6 capitoli di apprendimento di un haskell . Durante la lettura di questi, è una buona idea risolvere anche semplici problemi con ciò che sai.
Altre due buone risorse sono la programmazione Haskell dai primi principi e la programmazione in Haskell . Entrambi vengono forniti con esercizi per ogni capitolo, quindi hai piccoli e semplici problemi che corrispondono a quanto appreso nelle ultime pagine.
Un buon elenco di problemi da provare è la pagina dei problemi di haskell 99 . Questi iniziano molto di base e diventano più difficili man mano che procedi. È una buona pratica fare molte di queste, poiché ti consentono di esercitare le tue abilità nella ricorsione e nelle funzioni di ordine superiore. Consiglierei di saltare tutti i problemi che richiedono casualità in quanto è un po 'più difficile in Haskell. Controlla questa domanda SO nel caso in cui desideri testare le tue soluzioni con QuickCheck (vedi Intermedio di seguito).
Dopo aver fatto alcuni di questi, potresti passare a fare alcuni dei problemi di Project Euler . Questi sono ordinati per quante persone li hanno completati, il che è abbastanza una buona indicazione della difficoltà. Questi testano la tua logica e Haskell più dei problemi precedenti, ma dovresti comunque essere in grado di fare i primi. Un grande vantaggio che Haskell ha con questi problemi è che gli interi non hanno dimensioni limitate. Per completare alcuni di questi problemi, sarà utile leggere i capitoli 7 e 8 per imparare anche un Haskell.
Principiante
Dopodiché dovresti avere una buona padronanza della ricorsione e delle funzioni di ordine superiore, quindi sarebbe un buon momento per iniziare a fare alcuni problemi nel mondo reale. Un ottimo punto di partenza è Real World Haskell (libro online, è inoltre possibile acquistare una copia cartacea). Ho scoperto che i primi capitoli sono stati introdotti troppo rapidamente per qualcuno che non ha mai fatto programmazione funzionale / usato ricorsione in precedenza. Tuttavia, con la pratica che avresti avuto dal fare i problemi precedenti, dovresti trovarlo perfettamente comprensibile.
Risolvere i problemi del libro è un ottimo modo per imparare a gestire le astrazioni e costruire 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 classi oo, più come le interfacce oo ). Non credo sia una buona idea saltare i capitoli, poiché ognuno introduce molte nuove idee che verranno utilizzate nei capitoli successivi.
Dopo un po 'arriverai al capitolo 14, il temuto capitolo delle monadi (dum dum dummmm). Quasi tutti coloro che imparano Haskell hanno difficoltà a comprendere le monadi, a causa di quanto sia astratto il concetto. Non riesco a pensare a nessun concetto in un'altra lingua tanto astratto quanto le monadi nella programmazione funzionale. Monads consente di unire molte idee (come operazioni IO, calcoli che potrebbero fallire, analisi, ...) in un'unica idea. Quindi non scoraggiarti se dopo aver letto il capitolo sulle 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 sulla monade . Consiglio vivamente All About Monads , ma anche gli altri sono buoni.
Inoltre, ci vuole un po 'di tempo prima che i concetti affondino davvero. Questo avviene attraverso l'uso, ma anche attraverso il tempo. Trovo che a volte dormire su un problema aiuti 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 ciò accade e quando accade, potresti trovare Haskell come il tuo linguaggio di programmazione imperativo preferito :)
Per essere sicuro di comprendere perfettamente il sistema di tipi Haskell, dovresti provare a risolvere 20 esercizi intermedi di haskell . Questi esercizi usano nomi divertenti di funzioni come "peloso" e "banana" e ti aiutano ad avere una buona comprensione di alcuni concetti di programmazione funzionale di base se non li hai già. Bel modo di passare la serata con un mucchio di carte coperte di frecce, unicorni, salsicce e banane pelose.
Intermedio
Una volta che capisci Monads, penso che tu abbia fatto il passaggio da un programmatore Haskell principiante a un haskeller intermedio. Quindi dove andare da qui? La prima cosa che consiglierei (se non le hai già imparate imparando le monadi) sono i vari tipi di monadi, come Reader, Writer e State. Ancora una volta, il mondo reale Haskell e All about monads ne danno una grande spiegazione. Per completare l'addestramento sulla monade è necessario conoscere i trasformatori di monade. Questi ti consentono di combinare diversi tipi di Monadi (come un Reader e una monade di Stato) in uno. Questo può sembrare inutile per cominciare, ma dopo averli usati per un po 'ti chiederai come hai vissuto senza di loro.
Ora puoi finire il libro reale di Haskell se vuoi. Saltare i capitoli ora non ha molta importanza, a patto che tu abbia le monadi a terra. Scegli quello che ti interessa.
Con la conoscenza che avresti ora, dovresti essere in grado di usare la maggior parte dei pacchetti su cabala (almeno quelli documentati almeno ...), così come la maggior parte delle librerie fornite con Haskell. Un elenco di librerie interessanti da provare sarebbe:
Parsec : per l'analisi di programmi e testo. Molto meglio dell'uso di regexps. Ottima documentazione, ha anche un capitolo Haskell del mondo reale.
QuickCheck : un programma di test davvero interessante. Quello che fai è scrivere un predicato che dovrebbe essere sempre vero (ad es length (reverse lst) == length lst
.). Quindi si passa il predicato al QuickCheck, che genererà molti valori casuali (in questo caso elenchi) e si verifica che il predicato sia vero per tutti i risultati. Vedi anche il manuale online .
HUnit : unit testing in Haskell.
gtk2hs : il framework gui più popolare per Haskell, 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 snap e yesod ).
Inoltre, ci sono molti concetti (come il concetto di Monade) che dovresti eventualmente imparare. Sarà più facile dell'apprendimento delle Monadi la prima volta, poiché il tuo cervello sarà abituato a gestire il livello di astrazione coinvolto. Un'ottima panoramica per conoscere questi concetti di alto livello e come si adattano insieme è 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 Applicativi ma non sono Monadi. Inoltre, il codice scritto usando le funzioni Applicative è spesso più componibile che scrivere il codice equivalente usando le funzioni Monad. Vedi i Functor, i Functor applicabili e i Monoidi dall'apprendere una guida haskell.
Pieghevole , Traversable : Typeclasses che molte astratta delle operazioni di liste, in modo che le stesse funzioni possono essere applicati ad altri tipi di contenitori. Vedi anche la spiegazione della wiki di haskell .
Monoid : un monoid è un tipo che ha un valore zero (o mempty) e un'operazione, notata <>
che unisce due monoidi insieme, tale che x <> mempty = mempty <> x = x
e x <> (y <> z) = (x <> y) <> z
. Queste sono chiamate leggi di identità e associatività. Molti tipi sono Monoidi, come i numeri, con mempty = 0
e <> = +
. Questo è utile in molte situazioni.
Frecce : le frecce sono un modo per rappresentare i calcoli che accettano un input e restituiscono un output. Una funzione è il tipo più semplice di freccia, ma ce ne sono molti altri. La libreria ha anche molte funzioni molto utili per manipolare le frecce: sono molto utili anche se usate solo con semplici funzioni di Haskell.
Array : i vari array mutabili / immutabili in Haskell.
Monade ST : consente di scrivere codice con uno stato mutabile che viene eseguito molto rapidamente, pur rimanendo puro al di fuori della 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 una GUI). Non ne so molto però. Il discorso di Paul Hudak su Yampa è un buon inizio.
Ci sono molte nuove funzionalità linguistiche che dovresti dare un'occhiata. Li elencherò, puoi trovare molte informazioni su di loro da google, il haskell wikibook , il sito haskellwiki.org e la documentazione di ghc .
- Classi di tipo multiparametro / dipendenze funzionali
- Digitare le famiglie
- Tipi quantificati esistenzialmente
- Tipi fantasma
- GADTS
- altri...
Molta parte di Haskell si basa sulla teoria delle categorie , quindi potresti voler esaminare questo. Un buon punto di partenza è la teoria delle categorie per informatici . Se non si desidera acquistare il libro, anche l' articolo correlato dell'autore è eccellente.
Infine, vorrai saperne di più sui vari strumenti Haskell. Questi includono:
- ghc (e tutte le sue caratteristiche)
- cabala : il sistema di pacchetti Haskell
- darcs : un sistema di controllo di versione distribuito scritto in Haskell, molto popolare per i programmi Haskell.
- eglefino : un generatore di documentazione automatica Haskell
Mentre apprendi tutte queste nuove biblioteche e concetti, è molto utile scrivere un progetto di medie dimensioni 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. Rimani a questo livello per anni (questo è dove sono io).
Esperto
Ci vorranno anni per arrivare a questo stadio (ciao dal 2009!), Ma da qui suppongo che inizi a scrivere documenti di dottorato, nuove estensioni di ghc e inventare nuove astrazioni.
Ricevere aiuto
Infine, mentre in qualsiasi fase dell'apprendimento, ci sono più posti per ottenere informazioni. Questi sono:
- il canale #haskell irc
- le mailing list . Vale la pena iscriversi solo per leggere le discussioni che si svolgono - alcune sono molto interessanti.
- altri posti elencati nella home page di haskell.org
Conclusione
Bene, questo si è rivelato più lungo di quanto mi aspettassi ... Comunque, penso che sia un'ottima idea diventare abili in Haskell. Ci vuole molto tempo, ma ciò è dovuto principalmente al fatto che stai imparando un modo di pensare completamente nuovo. Non è come imparare Ruby dopo aver appreso Java, ma come imparare Java dopo aver appreso C. Inoltre, sto scoprendo che le mie capacità di programmazione orientata agli oggetti sono migliorate grazie all'apprendimento di Haskell, poiché sto vedendo molti nuovi modi di astrarre idee.