learnhaskell/guide-it.md

722 lines
34 KiB
Markdown
Raw Normal View History

2015-03-13 10:25:12 +00:00
# La Guida
2015-03-22 16:23:51 +00:00
Questa è la strada che raccomando per imparare Haskell.
2015-03-13 11:33:45 +00:00
## Per chi non parla italiano
* [Auf Deutsch](guide-de.md)
* [Στην ελληνική](guide-el.md)
* [En Français](guide-fr.md)
* [In English](README.md)
* [Em Português](guide-pt.md)
* [Türkçe](guide-tr.md)
2015-03-22 16:23:51 +00:00
#### Un consiglio: *non preoccupatevi se non capite qualcosa alla prima lettura*. Andate avanti.
2015-03-13 11:33:45 +00:00
## Comunità
Il nostro canale IRC è `#haskell-beginners` su Freenode.
2015-03-22 17:03:24 +00:00
Un client web per IRC è disponibile [qui](http://webchat.freenode.net/).
2015-03-13 11:33:45 +00:00
2015-03-13 11:42:46 +00:00
La [mailing list](https://wiki.haskell.org/Mailing_lists) di Haskell.
2015-03-13 11:33:45 +00:00
### Linee guida per la comunità
2015-03-20 01:19:35 +00:00
[Leggete il post di Chris Done sull'insegnamento](http://chrisdone.com/posts/teaching).
2015-03-22 16:23:51 +00:00
Siate gentili e cortesi. Comportamenti crudeli o meschini spaventano gli altri e fanno passare la voglia di partecipare.
2015-03-13 11:33:45 +00:00
2015-03-22 16:23:51 +00:00
Crtitiche facili, in cui non mettete impegno, beneficiano soltanto voi e non la persona che le riceve.
2015-03-13 11:33:45 +00:00
2015-03-22 16:23:51 +00:00
Non descrivete niente con parole come "facile" o "banale". Chi legge si sentirà stupido perché le cose che definite come triviali possono aver richiesto molto impegno. Spesso chi impara lentamente impara più profondamente, è una cosa che dovremmo perseguire!
2015-03-13 11:33:45 +00:00
2015-03-22 16:23:51 +00:00
Non fate finta di essere sorpresi quando qualcuno vi dice che non sa qualcosa. Lo farete sentire soltanto stupido e non avrete ottenuto niente a parte sentirvi più furbi.
2015-03-13 11:33:45 +00:00
2015-03-22 17:03:24 +00:00
Non dite beh-in realtà. Come quando qualcuno dice che qualcosa è quasi, ma non completamente corretta, e voi cominciate a dire, "beh, in realtà…" e poi fate una piccola correzione. È molto irritante, specialmente quando la correzione non è pertinente alla conversazione che state avendo. Questo non significa che l'Hacker School non si preoccupi della verità o che non ci interessi essere precisi. Ma questi modi di fare sono quasi sempre più una questione di pavoneggiamento che altro.
2015-03-13 11:33:45 +00:00
2015-03-22 16:23:51 +00:00
Non dite agli altri cosa devono fare. Se qualcuno sta completando un esercizio non dovreste interromperlo continuamente con consigli. Lasciate che trovi la sua strada a meno che non lo chieda esplicitamente. Evitare interruzioni è [uno degli obiettivi fondamentali di #haskell-beginners](http://chrisdone.com/posts/teaching).
2015-03-13 11:33:45 +00:00
2015-03-22 17:03:24 +00:00
Non lasciate spazio a sottili "ismi". Razzismo, sessismo, omofobia, transfobia, e altri tipi di pregiudizi non saranno tollerati.
2015-03-13 11:33:45 +00:00
---
2015-03-14 01:36:27 +00:00
2015-03-22 16:23:51 +00:00
Linee guida tratte dal [manuale della Hacker School ](https://www.hackerschool.com/manual). Grazie per averle rese pubbliche.
2015-03-14 01:36:27 +00:00
# Cosa sono Haskell, GHC e Cabal?
2015-03-22 16:23:51 +00:00
Haskell è un linguaggio di programmazione, e come potete leggere nei report, la versione più recente è stata rilasciata nel 2010. Il report è disponibile online:
[report](http://www.haskell.org/onlinereport/haskell2010/).
2015-03-14 01:36:27 +00:00
## GHC
2015-03-22 16:23:51 +00:00
[GHC](http://www.haskell.org/ghc/) è il modo più classico per lavorare in Haskell. Include un compilatore, un REPL (interprete), un gestore automatico di pacchetti e librerie, ed altro.
2015-03-14 01:36:27 +00:00
## Cabal
2015-03-22 17:03:24 +00:00
[Cabal](https://www.haskell.org/cabal/download.html) è software per gestire i progetti haskell e risolvere le dipendenze. È lo strumento che vi permetterà di installare i pacchetti, tipicamente ciascuno nel proprio sandbox.
2015-03-14 01:36:27 +00:00
Cabal è equivalente a Bundler di Ruby, pip di Python, NPM di Node, Maven, etc. GHC
2015-03-22 16:23:51 +00:00
gestisce i pacchetti indipendentemente, Cabal sceglie quale versione installare.
2015-03-14 01:36:27 +00:00
# Il set-up dei tool
## Ubuntu
2015-03-22 16:23:51 +00:00
[Questo PPA](http://launchpad.net/~hvr/+archive/ghc) è ottimo ed è quello che uso su tutte le mie macchine linux, sia per i build automatici che per lo sviluppo.
2015-03-14 01:36:27 +00:00
Istruzioni specifiche:
```bash
$ sudo apt-get update
$ sudo apt-get install python-software-properties # v12.04 and below
$ sudo apt-get install software-properties-common # v12.10 and above
$ sudo add-apt-repository -y ppa:hvr/ghc
$ sudo apt-get update
$ sudo apt-get install cabal-install-1.20 ghc-7.8.3 happy-1.19.4 alex-3.1.3
```
2015-03-22 16:23:51 +00:00
Aggiungete poi la seguente linea al vostro `$PATH` (bash\_profile, zshrc, bashrc, etc):
2015-03-14 01:36:27 +00:00
```
~/.cabal/bin:/opt/cabal/1.20/bin:/opt/ghc/7.8.3/bin:/opt/happy/1.19.4/bin:/opt/alex/3.1.3/bin
```
2015-03-22 17:03:24 +00:00
*Opzionale:* Potete anche aggiungere `.cabal-sandbox/bin` al vostro path. Il codice che state sviluppando attivamente sarà così disponibile dalla linea di comando. Questo funziona solo quando la directory in cui siete è un sandbox di cabal.
2015-03-14 01:36:27 +00:00
## Debian
2015-03-22 16:23:51 +00:00
### Repository GHC per debian stable
2015-03-14 01:36:27 +00:00
2015-03-22 16:23:51 +00:00
Se utilizzate Debian stable, è meglio usare il repository http://deb.haskell.org/. Per usarlo:
2015-03-14 01:36:27 +00:00
- Aggiungete la linea `deb http://deb.haskell.org/stable/ ./` a `/etc/apt/sources.list`
```bash
## Aggiungi la chiave per evitare warning
$ GET http://deb.haskell.org/deb.haskell.org.gpg-key | apt-key add -
$ sudo apt-get update
$ sudo apt-get install ghc-7.8.3 happy alex cabal-install
```
### Usando Ubuntu PPA
2015-03-22 17:03:24 +00:00
Se non state usando Debian stable, le stesse istruzioni che abbiamo indicato per Ubuntu fuzionano, ma dovrete eseguire un comando in più. Immediatamente dopo che il comando
2015-03-22 16:23:51 +00:00
`sudo add-apt-repository -y ppa:hvr/ghc`
lanciate:
2015-03-14 01:36:27 +00:00
```bash
$ sudo sed -i s/jessie/trusty/g /etc/apt/sources.list.d/hvr-ghc-jessie.list
```
2015-03-22 16:23:51 +00:00
Per altre versioni di Debian dovete solo rimpiazzare tutte le occorrenze di `jessie` con il nome della versione che state utilizzando nel comando di cui sopra.
2015-03-14 01:36:27 +00:00
2015-03-22 16:23:51 +00:00
Se per qualche ragione il file `/etc/apt/sources.list.d/hvr-ghc-jessie.list` non dovesse esistere, allora `/etc/apt/sources.list` dovrebbe contenere una linea come questa:
2015-03-14 01:36:27 +00:00
deb http://ppa.launchpad.net/hvr/ghc/ubuntu jessie main
2015-03-22 16:23:51 +00:00
Rimpiazzate quindi in quella linea `jessie` con `trusty`.
2015-03-15 17:53:52 +00:00
### Compilazione manuale
Potete seguire
2015-03-22 16:23:51 +00:00
[questa](http://www.davesquared.net/2014/05/platformless-haskell.html) guida scritta per Mac OS X:
2015-03-15 17:53:52 +00:00
Note:
- Quando configurate ghc settate il prefisso appropriato
2015-03-22 16:23:51 +00:00
- Invece di prendere il binario di `cabal-install`, scaricate il codice sorgente e lanciate lo script
2015-03-15 17:53:52 +00:00
`bootstrap.sh`.
## Fedora 21
2015-03-22 16:23:51 +00:00
Per installare Haskell 7.8.4 dal repository non ufficiale (Fedora 22+ lo includerà ufficialmente):
2015-03-15 17:53:52 +00:00
```bash
$ sudo yum-config-manager --add-repo \
> https://copr.fedoraproject.org/coprs/petersen/ghc-7.8.4/repo/fedora-21/petersen-ghc-7.8.4-fedora-21.repo
$ sudo yum install ghc cabal-install
```
Come affermato in
[petersen/ghc-7.8.4 copr page](https://copr.fedoraproject.org/coprs/petersen/ghc-7.8.4/)
2015-03-22 16:23:51 +00:00
questo ghc non può essere installato insieme con il ghc di Fedora/EPEL.
2015-03-15 17:53:52 +00:00
## Arch Linux
2015-03-22 16:23:51 +00:00
Per installare Haskell dal repository ufficiale su Arch Linux, lanciate
2015-03-15 17:53:52 +00:00
```bash
$ sudo pacman -S cabal-install ghc happy alex haddock
```
## Gentoo
Su Gentoo, potete installare i singoli componenti della Haskell Platform
attraverso Portage. Se usate `ACCEPT_KEYWORDS=arch` (invece che
2015-03-22 17:03:24 +00:00
`ACCEPT_KEYWORDS=~arch`), Portage installerà versioni più vecchie di Haskell. Tenendone di conto, se usate `ACCEPT_KEYWORDS=arch`, aggiungete le seguenti linee a `/etc/portage/package.keywords`.
2015-03-15 17:53:52 +00:00
dev-haskell/cabal-install
dev-lang/ghc
2015-03-22 16:23:51 +00:00
Una volta fatto quello, lanciate:
2015-03-15 17:53:52 +00:00
```bash
$ emerge -jav dev-lang/ghc dev-haskell/cabal-install
```
2015-03-22 16:23:51 +00:00
Gentoo include una versione "stabile" (leggi: vecchia) di `cabal-install` nell'albero di Portage, quindi vorrete usare `cabal-install` per installare la versione più recente. I backslash sono intenzionali.
2015-03-15 17:53:52 +00:00
```bash
$ \cabal update # I backslash
$ \cabal install cabal-install # sono intentionali
```
2015-03-22 16:23:51 +00:00
Adesso avete installato cabal a livello globale con portage, e localmente nella vostra home directory con `cabal-install`. Il prossimo passo è assicurarsi che quando lanciate `cabal` in un terminale, la vostra shell lanci la versione più recente che è nella vostra home directory. Aggiugete le linee seguenti nel file di configurazione della vostra shell:
2015-03-15 17:53:52 +00:00
```bash
PATH=$PATH:$HOME/.cabal/bin
alias cabal="$HOME/.cabal/bin/cabal"
```
2015-03-18 09:20:07 +00:00
Se non sapete quale shell avete, è molto probabile che la vostra shell sia Bash. Se usate Bash, il file che dovete editare è `~/.bashrc`. se usate Z-shell, il file è `~/.zshrc`. Potete lanciare il seguete comando per sapere qual'è la vostra shell.
2015-03-15 17:53:52 +00:00
```bash
echo $SHELL | xargs basename
```
Io uso zsh, quindi il comando restituisce `zsh` quando lo lancio.
2015-03-22 16:23:51 +00:00
Una volta fatto tutto questo, dovrete installare i tool addizionali `alex` e `happy`.
2015-03-15 17:53:52 +00:00
```bash
$ cabal install alex happy
```
Congratulazioni! Adesso avete una installazione di Haskell funzionante!
## Mac OS X
### 10.9
2015-03-22 16:23:51 +00:00
Installate [GHC per Mac OS X](http://ghcformacosx.github.io/), che include GHC e Cabal. La guida vi darà istruzioni su come installare GHC e Cabal nel vostro path una volta che avete copiato la .app da qualche parte sul disco fisso.
2015-03-15 17:53:52 +00:00
### 10.6-10.8
2015-03-22 16:23:51 +00:00
Eseguite l'installazione dei binari come scritto qui sotto usando [questo tarball](https://www.haskell.org/platform/download/2014.2.0.0/ghc-7.8.3-x86_64-apple-darwin-r3.tar.bz2).
2015-03-15 17:53:52 +00:00
## Windows
2015-03-22 16:23:51 +00:00
- L' [installer minimo per windows di GHC](http://neilmitchell.blogspot.com/2014/12/beta-testing-windows-minimal-ghc.html)
è in grado di compilare `network` e altro. È tecnicamente in beta ma dovrebbe funzionare per gli scopi di chiunque legga questa guida.
2015-03-15 17:53:52 +00:00
2015-03-22 17:03:24 +00:00
Non dimenticatevi di lanciare l'installer come amministratore, dato che è richiesto l'accesso alla directory di sistema 'Programmi'.
2015-03-15 17:53:52 +00:00
## Altri utenti Linux
Scaricate l'ultima distribuzione binaria di cabal e ghc:
- [GHC](http://www.haskell.org/ghc/).
- [Cabal](https://www.haskell.org/cabal/download.html).
# Corsi primari
## Il corso cis194 di Yorgey
2015-03-22 16:23:51 +00:00
> *Seguite questo per primo*, è la strada che raccomando per il primo approccio ad
2015-03-15 17:53:52 +00:00
> Haskell.
Disponibile [online](http://www.seas.upenn.edu/~cis194/spring13/lectures.html).
2015-03-22 16:23:51 +00:00
Il corso di [Brent Yorgey](https://byorgey.wordpress.com) è il migliore che ho trovato finora. Questo corso ha valore non solo perché vi rende in grado di scrivere codice Haskell basilare ma anche perché vi aiuterà a comprendere i parser combinators.
2015-03-15 17:53:52 +00:00
2015-03-22 16:23:51 +00:00
L'unica ragione per cui non dovreste cominciare con cis194 è se non siete programmatori o se non avete molta esperienza. In questo caso, suggerisco di iniziare con il
2015-03-15 17:53:52 +00:00
[libro di Thompson](http://www.haskellcraft.com/craft3e/Home.html) e poi passate a cis194.
---
## Il corso NICTA
2015-03-22 16:23:51 +00:00
> Questo è il corso che raccomando dopo cis194 di Yorgey
2015-03-15 17:53:52 +00:00
Disponibile su github [qui](https://github.com/NICTA/course).
2015-03-22 16:23:51 +00:00
Questo vi darà esperienza nell'implementare direttamente le astrazioni introdotte in cis194. Questi esercizi sono *fondamentali* per sviluppare confidenza con gli usi comuni di Functor/Applicative/Monad/etc. in Haskell. La raccomandazione principale di questa guida è seguire cis194 e poi NICTA: questo è il percorso che seguo per insegnare Haskell a tutti.
2015-03-15 17:53:52 +00:00
---
## Corso Supplementare cs240h
2015-03-18 09:20:07 +00:00
> Fornisce più materiale sugli argomenti intermedi
2015-03-15 17:53:52 +00:00
Disponibile [online](http://www.scs.stanford.edu/14sp-cs240h/).
2015-03-22 16:23:51 +00:00
Questo è il corso online di [Bryan O'Sullivan](https://github.com/bos) tratto dal corso che insegna a Stanford. Se non sapete chi è, date un'occhiata alla metà delle librerie che qualsiasi progetto Haskell richiede e ci troverete il suo nome. Sa avete già seguito il corso di Yorgey sono particolarmente rilevanti i moduli sui phantom types, il flusso di controllo delle informazioni, le estensioni del linguaggio, le concorrenza, le librerie pipes e lenses.
2015-03-15 17:53:52 +00:00
---
## Materiale di riferimento per i tre corsi
[Learn You a Haskell for Great Good (LYAH)](http://learnyouahaskell.com) e
[Real World Haskell](http://book.realworldhaskell.org) (Grazie bos!) sono disponibili online.
2015-03-20 01:27:53 +00:00
Raccomando RWH come referenza (è un libro spesso). I capitoli sul parsing e sulle monadi
2015-03-22 17:03:24 +00:00
sono ottimi per arrivare a capire l'utilità delle monadi stesse. Alcuni hanno detto che è piaciuto molto. Probabilmente è un buon follow-up per imparare gli idiomi in modo pratico, una volta che avete imparato le cose essenziali di Haskell?
2015-03-15 17:53:52 +00:00
### Cosa fa quel syntactic sugar `<-` / `do` / sulle list comprehension?
Eccellente [articolo](http://www.haskellforall.com/2014/10/how-to-desugar-haskell-code.html).
### Per capire list e fold
2015-03-20 01:19:35 +00:00
- [Explain List Folds to Yourself](http://vimeo.com/64673035)
2015-03-15 17:53:52 +00:00
2015-03-22 16:23:51 +00:00
### Per imparare alcune Typeclass di uso comune
2015-03-15 17:53:52 +00:00
2015-03-22 16:23:51 +00:00
Utile per capire `Functor`, `Applicative`, `Monad`, `Monoid` e altre Typeclass di uso comune, ma anche informazioni specifiche di Hask e di Teoria delle Categorie:
2015-03-15 17:53:52 +00:00
2015-03-22 16:23:51 +00:00
- La [Typeclassopedia](http://www.haskell.org/haskellwiki/Typeclassopedia)
2015-03-15 17:53:52 +00:00
2015-03-18 09:20:07 +00:00
### Capire i messaggi di errore più comuni di Haskell
2015-03-15 17:53:52 +00:00
2015-03-18 09:20:07 +00:00
- [Capire i messaggi di errore più comuni](http://ics.p.lodz.pl/~stolarek/_media/pl:research:stolarek_understanding_basic_haskell_error_messages.pdf)
2015-03-15 17:53:52 +00:00
---
# Laziness, strictness, guarded recursion
2015-03-20 01:19:35 +00:00
- Il [libro](http://chimera.labs.oreilly.com/books/1230000000929/ch02.html) di Marlow
2015-03-22 16:23:51 +00:00
sul parallelismo e la concorrenza ha una delle migliori introduzioni alla laziness e alla normal form che abbia trovato. Avrete bisogno di materiale in più se non acquisite i concetti subito.
2015-03-15 17:53:52 +00:00
2015-03-20 01:19:35 +00:00
- [More points for lazy evaluation](http://augustss.blogspot.hu/2011/05/more-points-for-lazy-evaluation-in.html)
2015-03-15 17:53:52 +00:00
- [Oh my laziness!](http://alpmestan.com/posts/2013-10-02-oh-my-laziness.html)
2015-03-22 16:23:51 +00:00
- Domanda su Stack Overflow '[Does haskell have laziness?](http://stackoverflow.com/questions/13042353/does-haskell-have-tail-recursive-optimization)'
2015-03-15 17:53:52 +00:00
2015-03-22 16:23:51 +00:00
- La presentazione di [Johan Tibell](https://github.com/tibbe) su
2015-03-20 01:19:35 +00:00
[reasoning about laziness](http://www.slideshare.net/tibbe/reasoning-about-laziness).
2015-03-15 17:53:52 +00:00
## Breve dimostrazione
```haskell
2015-03-20 01:27:53 +00:00
let a = 1 : a -- guarded recursion, (:) è lazy su di esso si può usare pattern matching.
2015-03-15 17:53:52 +00:00
let (v : _) = a
> v
1
> head a -- head a == v
1
2015-03-20 01:27:53 +00:00
let a = 1 * a -- non guarded, (*) è strict
2015-03-15 17:53:52 +00:00
> a
*** Exception: <<loop>>
```
# IO
2015-03-20 01:19:35 +00:00
- [Evaluation order and State tokens](https://www.fpcomplete.com/user/snoyberg/general-haskell/advanced/evaluation-order-and-state-tokens)
2015-03-15 17:53:52 +00:00
2015-03-20 01:19:35 +00:00
- [Unraveling the mystery of the IO monad](http://blog.ezyang.com/2011/05/unraveling-the-mystery-of-the-io-monad/).
2015-03-15 17:53:52 +00:00
- [First class "statements"](http://blog.jle.im/entry/first-class-statements).
2015-03-20 01:19:35 +00:00
- [Haddocks for System.IO.Unsafe.unsafePerformIO](http://hackage.haskell.org/package/base-4.7.0.1/docs/System-IO-Unsafe.html#v:unsafePerformIO)
2015-03-22 16:23:51 +00:00
Leggete la documentazione e le note sulla implementazione di unsafeDupablePerformIO
2015-03-15 17:53:52 +00:00
Commento da un thread di Reddit, di `glaebhoerl`
> Nota interessante: GHC deve nascondere la rappresentazione dello state token
2015-03-22 17:03:24 +00:00
> dietro un tipo IO astratto perché lo state token deve sempre essere usato linearmente (non
2015-03-22 16:23:51 +00:00
> duplicato o droppato), ma il type system non può garantire che questo accada. Clean, un altro
> linguaggio lazy come Haskell, ha 'uniqueness types' (sono come i linear types
> e possibilmente diversi per aspetti di cui non sono a conoscenza), e espongono
2015-03-15 17:53:52 +00:00
> World-passing direttamente e forniscono una monade IO (non astratta) solo per
> convenienza.
# Monadi and monad transformers
2015-03-22 16:23:51 +00:00
> Non cominciate a imparali finché non capite typeclass, Monoid, Functor e
2015-03-15 17:53:52 +00:00
> Applicative!
2015-03-22 16:23:51 +00:00
Implementate per conto vostro le monadi della libreria standard (List, Maybe, Cont, Error, Reader,
Writer, State) per capirle meglio. Poi potreste provare a scrivere un interprete monadico per piccole espressioni facendo riferimento all'articolo
2015-03-20 01:19:35 +00:00
[Monad Transformers Step by Step](http://www.cs.virginia.edu/~wh5a/personal/Transformers.pdf) (menzionata in 'monad transformers' qui sotto).
2015-03-15 17:53:52 +00:00
2015-03-22 16:23:51 +00:00
Scrivere diversi interpreti cambiando solo la monade per cambiare la semantica può aiutarvi a capire in che cosa consiste.
2015-03-15 17:53:52 +00:00
2015-03-22 16:23:51 +00:00
- [Questa presentazione](https://vimeo.com/73648150) di Tony dà un eccellente motivazione per imparare i monad
2015-03-15 17:53:52 +00:00
transformers, [le slide](https://dl.dropboxusercontent.com/u/7810909/talks/monad-transformers/cbaa991e0eb49224eb286c1e418e2b9828e1fb21/monad-transformers.pdf).
2015-03-22 16:23:51 +00:00
Poi reimplementate `Control.Monad`. Funzioni come `mapM` o `sequence` sono buone opportunità per fare esercizio e scrivere codice monadico generico.
2015-03-15 17:53:52 +00:00
2015-03-22 16:23:51 +00:00
Il corso NICTA può essere usato come guida a questo scopo, che include anche lo scrivere la vostra typeclass Applicative.
2015-03-15 17:53:52 +00:00
Referenza:
- Commenti su Reddit di htmltyp and Crandom [qui](http://www.reddit.com/r/haskell/comments/29eke6/basic_program_ideas_for_learning_about_monads/cik5aj6).
- Commenti su Reddit di jozefg [qui](http://www.reddit.com/r/haskell/comments/29eke6/basic_program_ideas_for_learning_about_monads/cik5trg).
## Monad transformers
2015-03-20 01:19:35 +00:00
- [A gentle introduction to Monad Transformers](https://github.com/kqr/gists/blob/master/articles/gentle-introduction-monad-transformers.md).
2015-03-15 17:53:52 +00:00
2015-03-22 17:03:24 +00:00
- [Monad transformers step-by-step](http://www.cs.virginia.edu/~wh5a/personal/Transformers.pdf) (attenzione il codice riportato è datato).
2015-03-15 17:53:52 +00:00
2015-03-22 17:03:24 +00:00
# Testare, test, specifiche, testing generativo e di proprietà
2015-03-15 17:53:52 +00:00
2015-03-18 09:20:07 +00:00
- Questo [tutorial](https://github.com/kazu-yamamoto/unit-test-example/blob/master/markdown/en/tutorial.md) di Kazu Yamamoto è fantastico.
2015-03-15 17:53:52 +00:00
2015-03-22 17:03:24 +00:00
- [Simple-Conduit](https://github.com/jwiegley/simple-conduit): Un'ottima libreria per imparare in modo semplice come funziona lo streaming IO in generale; la conoscenza è trasferibile a librerie più complesse come Pipes e Conduit
2015-03-15 17:53:52 +00:00
# Parsing in Haskell
2015-03-19 01:55:05 +00:00
- [Tutorial](https://github.com/JakeWheat/intro_to_parsing) sui Parser combinator
per Haskell, usando Parsec
2015-03-15 17:53:52 +00:00
2015-03-20 01:19:35 +00:00
- [Writing your own micro-Parsec](http://olenhad.me/articles/monadic-parsers/)
2015-03-15 17:53:52 +00:00
2015-03-19 01:55:05 +00:00
## Parsare e generare JSON
2015-03-15 17:53:52 +00:00
2015-03-20 01:27:53 +00:00
Aeson è la soluzione di parsing [JSON](https://json.org) standard in
2015-03-19 01:55:05 +00:00
haskell. Disponibile su [hackage](https://hackage.haskell.org/package/aeson) e
2015-03-15 17:53:52 +00:00
[github](https://github.com/bos/aeson).
2015-03-20 01:19:35 +00:00
- [Parsing JSON using Aeson](http://blog.raynes.me/blog/2012/11/27/easy-json-parsing-in-haskell-with-aeson/)
2015-03-15 17:53:52 +00:00
2015-03-20 01:19:35 +00:00
- [Aeson and user created types](http://bitemyapp.com/posts/2014-04-11-aeson-and-user-created-types.html)
2015-03-15 17:53:52 +00:00
2015-03-20 01:19:35 +00:00
- [Parsing non-deterministic data with aeson and sum types](http://bitemyapp.com/posts/2014-04-17-parsing-nondeterministic-data-with-aeson-and-sum-types.html)
2015-03-15 17:53:52 +00:00
2015-03-19 01:55:05 +00:00
- [Tutorial di Aeson](https://www.fpcomplete.com/school/starting-with-haskell/libraries-and-frameworks/text-manipulation/json)
2015-03-15 17:53:52 +00:00
2015-03-19 01:55:05 +00:00
# Algoritmi per grafi e strutture dati
2015-03-15 17:53:52 +00:00
2015-03-20 01:27:53 +00:00
- Il [pacchetto fgl](https://hackage.haskell.org/package/fgl) gli [algoritmi](http://hackage.haskell.org/package/fgl-5.4.2.2/docs/Data-Graph-Inductive-Query-SP.html) puramente funzionali per trovare la strada più breve.
2015-03-15 17:53:52 +00:00
2015-03-20 01:19:35 +00:00
- [Inductive graphs and Functional Graph Algorithms](http://web.engr.oregonstate.edu/~erwig/papers/abstracts.html#JFP01).
2015-03-15 17:53:52 +00:00
2015-03-20 01:19:35 +00:00
- [FGL/Haskell - A Functional Graph Library](http://web.engr.oregonstate.edu/~erwig/fgl/haskell/old/fgl0103.pdf).
2015-03-15 17:53:52 +00:00
2015-03-20 01:19:35 +00:00
- [Data.Graph source from Containers package](http://hackage.haskell.org/package/containers-0.5.5.1/docs/Data-Graph.html).
2015-03-15 17:53:52 +00:00
2015-03-19 01:55:05 +00:00
- Il [pacchetto graphs](https://hackage.haskell.org/package/graphs).
2015-03-15 17:53:52 +00:00
2015-03-19 01:55:05 +00:00
- [Domande su SO riguardo a PHOAS](http://stackoverflow.com/questions/24369954/separate-positive-and-negative-occurrences-of-phoas-variables-in-presence-of-rec)
2015-03-15 17:53:52 +00:00
2015-03-20 01:19:35 +00:00
- [PHOAS for free](https://www.fpcomplete.com/user/edwardk/phoas).
2015-03-15 17:53:52 +00:00
- [Tying the Knot](http://www.haskell.org/haskellwiki/Tying_the_Knot).
- [Hackage: dag](https://hackage.haskell.org/package/dag).
2015-03-19 01:55:05 +00:00
# Ambienti di sviluppo
2015-03-15 17:53:52 +00:00
## Emacs
2015-03-19 01:55:05 +00:00
- [Il tutorial di Alejandro Serras](https://github.com/serras/emacs-haskell-tutorial/blob/master/tutorial.md)
2015-03-15 17:53:52 +00:00
2015-03-19 01:55:05 +00:00
- [I miei dotfiles](https://github.com/bitemyapp/dotfiles/)
2015-03-15 17:53:52 +00:00
2015-03-19 01:55:05 +00:00
- [Il config emacs di Chris Done](https://github.com/chrisdone/chrisdone-emacs)
2015-03-15 17:53:52 +00:00
## Vim
2015-03-19 01:55:05 +00:00
- [Pagina di Vim su haskellwiki](http://www.haskell.org/haskellwiki/Vim)
2015-03-15 17:53:52 +00:00
- [Haskell-vim-now](https://github.com/begriffs/haskell-vim-now)
- [GHC-Mod](https://github.com/kazu-yamamoto/ghc-mod)
- [GHC-Mod vim plugin](https://github.com/eagletmt/ghcmod-vim)
- [Hindent](https://github.com/chrisdone/hindent)
## Sublime Text
- [SublimeHaskell](https://github.com/SublimeHaskell/SublimeHaskell)
2015-05-07 19:52:14 +00:00
# Lavorare con Cabal
2015-03-15 17:53:52 +00:00
2015-03-19 01:55:05 +00:00
## Linee guida di Cabal
2015-03-15 17:53:52 +00:00
2015-03-22 16:23:51 +00:00
Prima dell'introduzione dei sandbox, gli utenti Haskell incappavano nel problema definito Cabal Hell (Inferno di Cabal). Se non utilizzate una sandbox, cabal installerà il pacchetto nel vostro user package-db. Questa *non* è in genere una buona idea, fatta l'eccezione per alcuni pacchetti di base come
2015-03-22 17:03:24 +00:00
Cabal, alex e happy. Nient'altro dovrebbe essere installato nel package-db dell'utente né tanto meno a livello globale, a meno che non sappiate cosa state facendo.
2015-03-15 17:53:52 +00:00
2015-03-22 16:23:51 +00:00
Alcune raccomandazioni per non cadere nel Cabal Hell sono disponibili
2015-03-19 01:55:05 +00:00
[qui](http://softwaresimply.blogspot.com/2014/07/haskell-best-practices-for-avoiding.html).
2015-03-15 17:53:52 +00:00
2015-03-22 16:23:51 +00:00
Per provare un pacchetto o cominciare un progetto, iniziate lanciando
2015-03-19 01:55:05 +00:00
`cabal sandbox init` in una nuova directory.
2015-03-15 17:53:52 +00:00
2015-03-19 01:55:05 +00:00
In poche parole:
2015-03-15 17:53:52 +00:00
2015-03-22 16:23:51 +00:00
- Quando installate nuovi pacchetti, create nuovi progetti o pre-esistenti, o cominciate esperimenti usate sempre i sandbox.
2015-03-15 17:53:52 +00:00
2015-03-22 16:23:51 +00:00
- Usate `cabal repl` invece per iniziare una istanza di ghci come project-scoped
2015-03-15 17:53:52 +00:00
2015-03-22 16:23:51 +00:00
Questo approccio basato sui sandbox dovrebbe scamparvi dai problemi relativi alle dipendenze dei paccheti, ma è incompatibile con il modo in cui la Haskell Platform fornisce i pacchetti binari. Se state imparando Haskell e non capite come funzionano ghc-pkg e Cabal, *evitate la haskell platform*, ed usate invece le istruzioni all'inizio della guida.
2015-03-15 17:53:52 +00:00
## Stackage
2015-03-22 16:23:51 +00:00
Tutti gli utenti (di solito utenti di Yesod) che hanno problemi di build potrebbero provare ad utilizzare Stackage.
2015-03-15 17:53:52 +00:00
2015-03-20 01:27:53 +00:00
- Un buon riassunto di Stackage è
2015-03-19 01:55:05 +00:00
[qui](https://www.fpcomplete.com/blog/2014/05/stackage-server).
2015-03-15 17:53:52 +00:00
2015-03-22 16:23:51 +00:00
Secondo l'opinione dell'autore, Stackage è in genere più utile di `cabal freeze`.
2015-03-15 17:53:52 +00:00
2015-03-19 01:55:05 +00:00
# Hoogle e Haddock
2015-03-15 17:53:52 +00:00
2015-03-22 16:23:51 +00:00
## Ricerca di codice mediante type signature
2015-03-15 17:53:52 +00:00
2015-03-20 01:27:53 +00:00
Il [motore di ricerca Hoogle](http://www.haskell.org/hoogle/) può cercare per tipo.
2015-03-15 17:53:52 +00:00
2015-03-19 01:55:05 +00:00
Per esempio, guardate i risultati della ricerca per `(a -> b) -> [a] -> [b]`
[qui](http://www.haskell.org/hoogle/?hoogle=%28a+-%3E+b%29+-%3E+%5ba%5d+-%3E+%5bb%5d).
2015-03-15 17:53:52 +00:00
2015-03-19 01:55:05 +00:00
Lo trovate anche su fpcomplete [qui](https://www.fpcomplete.com/hoogle).
2015-03-15 17:53:52 +00:00
2015-03-19 01:55:05 +00:00
Anche [Hayoo](http://holumbus.fh-wedel.de/hayoo/hayoo.html) (che cerca su tutto Hackage per default).
2015-03-15 17:53:52 +00:00
2015-03-19 01:55:05 +00:00
## Setup della tua istanza locale di Hoogle
2015-03-15 17:53:52 +00:00
2015-03-19 01:55:05 +00:00
Guardate [qui](https://gist.github.com/bitemyapp/3e6a015760775e0679bf).
2015-03-15 17:53:52 +00:00
## Haddock
2015-03-19 01:55:05 +00:00
1. [Aggiusta la tua documentazione hackage](http://fuuzetsu.co.uk/blog/posts/2014-01-06-Fix-your-Hackage-documentation.html)
2015-03-15 17:53:52 +00:00
2015-03-19 01:55:05 +00:00
2. [Documentazione Hackage v2](http://fuuzetsu.co.uk/blog/posts/2014-01-06-Hackage-documentation-v2.html)
2015-03-15 17:53:52 +00:00
2015-03-22 16:23:51 +00:00
Fate attenzione, questi post sono *lievemente obsoleti*: per esempio, adesso Hackage vanta nuovi modi di mostrare informazioni, documentazione e stato del build.
2015-03-15 17:53:52 +00:00
2015-03-20 01:19:35 +00:00
## Quello che davvero avete bisogno di sapere
2015-03-15 17:53:52 +00:00
2015-03-22 16:23:51 +00:00
Per far includere ad haddocks la documentazione per i pacchetti correlati, dovete settare `documentation: True` nel vostro `~/.cabal/config`. Se lasciato sul valore di default (`False`) o settato a `False`, prima di rigenerare la documentazione dovrete rimuovere tutti i vostri pacchetti e reinstallarli.
2015-03-15 17:53:52 +00:00
2015-03-22 16:23:51 +00:00
L'altra cosa da tenere a mente è che a causa del modo in cui il parametro `$pkg` viene interpretato *da* cabal, non da voi, i parametri `html-location` e `content-location` *devono essere fra apici* e inseriti in una shell o in uno shell script. Non funzioneranno in un Makefile, perché crederanno di essere variabili di Make!
2015-03-15 17:53:52 +00:00
```bash
#! /usr/bin/env sh
2015-03-20 01:19:35 +00:00
# potete scrivero su una linea sola non mettendo backslash
2015-03-15 17:53:52 +00:00
cabal haddock --hoogle --hyperlink-source \
--html-location='http://hackage.haskell.org/package/$pkg/docs' \
--contents-location='http://hackage.haskell.org/package/$pkg'
```
# TravisCI
2015-03-20 01:19:35 +00:00
Se siete fan di [TravisCI](https://travis-ci.org) come lo sono io, allora vi consiglio
*caldamente* di dare un'occhiata a
[multi-ghc-travis](https://github.com/hvr/multi-ghc-travis) come base per il `travis.yml` dei vostri progetti Haskell.
2015-03-15 17:53:52 +00:00
# Frontend/JavaScript
2015-03-20 01:19:35 +00:00
Abbiamo l'imbarazzo della scelta! Ci sono tre scelte principali che raccomanderei:
2015-03-15 17:53:52 +00:00
2015-03-20 01:19:35 +00:00
* [Haste](http://haste-lang.org/) un compilatore da Haskell a JavaScript
- Il [compilatore](https://github.com/valderman/haste-compiler) su github.
2015-03-22 16:23:51 +00:00
- Una [demo](http://www.airpair.com/haskell/posts/haskell-tutorial-introduction-to-web-apps)
2015-03-20 01:19:35 +00:00
eccellente di Haste con un progetto di esempio.
2015-03-15 17:53:52 +00:00
* [GHCJS](https://github.com/ghcjs/ghcjs)
2015-03-20 01:19:35 +00:00
- [Introduzione a GHCJS](http://weblog.luite.com/wordpress/?p=14)
2015-03-15 17:53:52 +00:00
- [Functional Reactive Web Interfaces with GHCJS and Sodium](http://weblog.luite.com/wordpress/?p=127)
- [Writing Atom plugins in Haskell using ghcjs ](http://edsko.net/2015/02/14/atom-haskell/)
* [PureScript](http://www.purescript.org/)
2015-03-20 01:27:53 +00:00
- Non è strettamente Haskell come Haste e GHCJS, ma è una scelta popolare fra i programmatori Haskell
2015-03-22 16:23:51 +00:00
- Scritto in ed ispirato ad Haskell
2015-03-20 01:19:35 +00:00
- Provate purescript nel vostro browser [here](http://try.purescript.org/)
- Ottima guida per [cominciare a usarlo](http://www.christopherbiscardi.com/2014/06/22/getting-started-with-purescript/)
2015-03-15 17:53:52 +00:00
2015-03-22 16:23:51 +00:00
## Quale linguaggio scegliere per il frontend?
2015-03-15 17:53:52 +00:00
2015-03-22 17:03:24 +00:00
GHCJS e Haste sono entrambi interamente compatibili con Haskell. GHCJS è compatibile con un numero maggiore di pacchetti Haskell rispetto a Haste, ma questo non è rilevante per molti progetti frontend. Al contrario, PureScript non è Haskell, per tanto non potrete condividere il codice fra frontend e backend.
2015-03-15 17:53:52 +00:00
2015-03-22 16:23:51 +00:00
GHCJS ha un runtime più grande, a 100kb (luite ci sta lavorando). Haste e PureScript sono competitivi.
2015-03-15 17:53:52 +00:00
2015-03-22 16:23:51 +00:00
PureScript ha la migliore integrazione con i tool di JS (usa gulp/grunt/bower), mentre GHCJS
2015-03-20 01:19:35 +00:00
e Haste si integrano meglio con i tool di Haskell (Cabal).
2015-03-15 17:53:52 +00:00
2015-03-22 16:23:51 +00:00
Tutti e tre sono un'ottima scelta e possono funzionare per la maggioranza dei progetti frontend.
2015-03-15 17:53:52 +00:00
2015-03-22 16:23:51 +00:00
# Per una comprensione più profonda della laziness, NF, WHNF
2015-03-15 17:53:52 +00:00
- [Notes on lambda calculus](https://vec.io/posts/notes-on-lambda-calculus).
2015-03-20 01:19:35 +00:00
## Articoli di ricerca sul lazy lambda calculi
2015-03-15 17:53:52 +00:00
- [A call by need lambda calculus](http://homepages.inf.ed.ac.uk/wadler/topics/call-by-need.html#need-journal).
- [Demonstrating Lambda Calculus Reduction](http://www.itu.dk/~sestoft/papers/sestoft-lamreduce.pdf)
- [The lazy lambda calculus](http://www.cs.ox.ac.uk/files/293/lazy.pdf).
- [Lazy evaluation of Haskell](http://www.vex.net/~trebla/haskell/lazy.xhtlm)
2015-03-20 01:19:35 +00:00
# Parallelismo/Concorrenza
2015-03-15 17:53:52 +00:00
2015-03-22 17:03:24 +00:00
- Il libro [Parallel and Concurrent Programming in Haskell](http://chimera.labs.oreilly.com/books/1230000000929) di Simon Marlow è probabilmente il migliore che abbia mai letto sull'argomento.
2015-03-15 17:53:52 +00:00
2015-03-22 16:23:51 +00:00
- Un [walk-through](http://kukuruku.co/hub/haskell/haskell-testing-a-multithread-application) completo su testing e incremental development di un applicazione multi-threaded in Haskell.
2015-03-15 17:53:52 +00:00
- [Functional Reactive Programming](http://www.haskell.org/haskellwiki/Functional_Reactive_Programming)
2015-03-22 16:23:51 +00:00
# Lenses e Prisms
2015-03-15 17:53:52 +00:00
2015-03-22 16:23:51 +00:00
Una volta che vi trovate a vostro agio con Haskell, è molto utile imparare Lens e
Prism, anche se solo come "utente". Non avete bisogno di capire le categorie sottostanti
2015-03-20 01:27:53 +00:00
perchè vi siano utili.
2015-03-15 17:53:52 +00:00
2015-03-22 16:23:51 +00:00
La difficoltà di usare la libreria Lens è generalmente sovrastimata. Chiunque sia a suo agio con Functor/Foldable/Traversable (o anche solo il primo) può usare lens e prism per rendersi la vita più facile.
2015-03-15 17:53:52 +00:00
2015-03-22 16:23:51 +00:00
Se vi è capitato di fare qualcosa come: `(fmap . fmap)` stavate usando mentalmente le 'lenti'.
2015-03-15 17:53:52 +00:00
2015-03-20 01:19:35 +00:00
Raccomando questi due tutorial/introduzioni:
2015-03-15 17:53:52 +00:00
- [A little lens starter tutorial](https://www.fpcomplete.com/school/to-infinity-and-beyond/pick-of-the-week/a-little-lens-starter-tutorial)
- [Lens: Lenses, Folds and Traversals](https://github.com/ekmett/lens#lens-lenses-folds-and-traversals)
2015-03-20 01:19:35 +00:00
Leggete questo per maggiori informazioni: [pacchetto Lens su hackage](http://hackage.haskell.org/package/lens).
2015-03-15 17:53:52 +00:00
2015-03-20 01:19:35 +00:00
# Schemi di ricorsione
2015-03-15 17:53:52 +00:00
2015-03-22 16:23:51 +00:00
Alcune delle pazze parole di cui avete sentito parlare che finiscono con \*-morfismo riguardano la ricorsione. NB - prima di iniziare a studiare il materiale che segue dovreste sapere come implementare foldr per le liste e almeno un'altra struttura di dati, tipo un albero. (i fold sono catamorfismi) Sapere come implementare un unfold (anamorfismo) per le stesse strutture dati è complementare.
2015-03-15 17:53:52 +00:00
2015-03-22 16:23:51 +00:00
Questo materiale si compenetra con traversable e foldable.
2015-03-15 17:53:52 +00:00
- [An introduction to recursion schemes](http://patrickthomson.ghost.io/an-introduction-to-recursion-schemes/)
- [Don't fear the cat](http://fho.f12n.de/posts/2014-05-07-dont-fear-the-cat.html) -
2015-03-20 01:19:35 +00:00
Buona dimostrazione su come l'ilomorfismo sia la composizione di cata e ana.
2015-03-15 17:53:52 +00:00
2015-03-20 01:27:53 +00:00
- [Recursion Schemes](http://comonad.com/reader/2009/recursion-schemes/) - Questa guida è ottima.
2015-03-15 17:53:52 +00:00
- [Functional Programming with Bananas, Lenses, Envelopes and Barbed Wire](http://eprints.eemcs.utwente.nl/7281/01/db-utwente-40501F46.pdf)
- [Catamorphisms](https://www.fpcomplete.com/user/edwardk/recursion-schemes/catamorphisms)
2015-03-20 01:19:35 +00:00
# GHC Core e ottimizzazione della performance
2015-03-15 17:53:52 +00:00
- [Write Haskell as Fast as C](write_haskell_as_fast_as_c.md)
- [GHC Wiki: CoreSyn Type](https://ghc.haskell.org/trac/ghc/wiki/Commentary/Compiler/CoreSynType).
- [Hackage: GHC Core](https://hackage.haskell.org/package/ghc-core).
- [SO Question: Reading GHC Core](http://stackoverflow.com/questions/6121146/reading-ghc-core).
- [Haskell as fast as C](http://donsbot.wordpress.com/2008/06/04/haskell-as-fast-as-c-working-at-a-high-altitude-for-low-level-performance/).
- [Real World Haskell, Chapter 25: Profiling and Optimizations](http://book.realworldhaskell.org/read/profiling-and-optimization.html).
2015-03-20 01:19:35 +00:00
# Tipi e Teoria delle Categorie
2015-03-15 17:53:52 +00:00
2015-03-20 01:27:53 +00:00
> *Non* è necessaria per scrivere Haskell, solo per quelli interessati!
2015-03-15 17:53:52 +00:00
2015-03-20 01:27:53 +00:00
Se volete imparare di più su tipi e teoria delle categorie:
2015-03-15 17:53:52 +00:00
2015-03-20 01:19:35 +00:00
- [La guida di Catster](http://byorgey.wordpress.com/2014/01/14/catsters-guide/) e [La seconda guida Catster](http://byorgey.wordpress.com/catsters-guide-2/)
2015-03-15 17:53:52 +00:00
2015-03-20 01:19:35 +00:00
- Il [wikibook haskell](http://en.wikibooks.org/wiki/Haskell/Category_theory) ha dei bei diagrammi
2015-03-15 17:53:52 +00:00
2015-03-20 01:19:35 +00:00
- [Teoria delle categorie](http://www.haskell.org/haskellwiki/Category_theory) su haskellwiki, ha anche buoni link ad altre risorse
2015-03-15 17:53:52 +00:00
2015-03-22 16:23:51 +00:00
- [Categories from scratch](http://science.raphael.poss.name/categories-from-scratch.html), include alcuni esempi pratici.
2015-03-15 17:53:52 +00:00
2015-03-20 01:19:35 +00:00
- La lista [Great Works in PL](http://www.cis.upenn.edu/~bcpierce/courses/670Fall04/GreatWorksInPL.shtml) di Pierce.
2015-03-15 17:53:52 +00:00
2015-03-20 01:19:35 +00:00
## Libri
2015-03-15 17:53:52 +00:00
2015-03-20 01:19:35 +00:00
- [Quora Question: What is the best textbook for category theory?](http://www.quora.com/Category-Theory/What-is-the-best-textbook-for-Category-theory?share=1) le raccomandazioni di Kmett
2015-03-15 17:53:52 +00:00
2015-03-20 01:19:35 +00:00
- [Awodey](http://ukcatalogue.oup.com/product/9780199237180.do) e
[MacLane](http://www.amazon.com/Categories-Working-Mathematician-Graduate-Mathematics/dp/0387984038). I libri di testo standard sulla teoria delle categorie
2015-03-15 17:53:52 +00:00
2015-03-20 01:27:53 +00:00
- [Harper's Practical Foundations for Programming Languages](http://www.cs.cmu.edu/~rwh/plbook/book.pdf) è la miglior introduzione alla teoria delle categorie focalizzata sui linguaggi di programmazione.
2015-03-15 17:53:52 +00:00
- [Type theory and Functional Programming](http://www.cs.kent.ac.uk/people/staff/sjt/TTFP/).
2015-03-20 01:19:35 +00:00
# Altri argomenti divertenti
2015-03-15 17:53:52 +00:00
2015-03-22 16:23:51 +00:00
## Parametricità, ad-hoc vs. polimorfismo parametrico e teoremi liberi
2015-03-15 17:53:52 +00:00
- [Parametricity](tony_parametricity.pdf).
2015-03-20 01:19:35 +00:00
- [Sorgenti TeX](https://github.com/tonymorris/parametricity/) per la presentazione di cui sopra.
2015-03-15 17:53:52 +00:00
- [Making ad-hoc polymorphism less ad-hoc](http://swizec.com/blog/week-20-making-ad-hoc-polymorphism-less-ad-hoc/swizec/6564).
- [Theorems for Free!](http://ttic.uchicago.edu/~dreyer/course/papers/wadler.pdf).
2015-03-22 16:23:51 +00:00
## Inizial e Final, DSL, Finally Tagless
2015-03-15 17:53:52 +00:00
- [Final Encodings, Part 1: A Quick Demonstration](http://creativelad.wordpress.com/2013/11/28/final-encodings-part-1-a-quick-demonstration/).
- [Transforming Polymorphic Values](http://martijn.van.steenbergen.nl/journal/2009/10/18/transforming-polymorphic-values/).
- [GADTs in Haskell 98](http://martijn.van.steenbergen.nl/journal/2009/11/12/gadts-in-haskell-98/).
- [Typed Tagless-Final Linear Lambda Calculus](https://www.fpcomplete.com/user/mutjida/typed-tagless-final-linear-lambda-calculus).
- [Typed tagless-final interpretations: Lecture notes](http://okmij.org/ftp/tagless-final/course/course.html).
- [Typed Tagless Final Interpreters](http://okmij.org/ftp/tagless-final/course/lecture.pdf).
2015-03-22 16:23:51 +00:00
- [The dog that didn't bark](http://existentialtype.wordpress.com/2011/03/21/the-dog-that-didnt-bark/) meno rilevante nello specifico ma comunque interessante.
2015-03-15 17:53:52 +00:00
2015-03-20 01:19:35 +00:00
## Comonadi
2015-03-15 17:53:52 +00:00
- [Comonads in Haskell](https://speakerdeck.com/dmoverton/comonads-in-haskell).
- [SO question: Can a Monad be a Comonad](http://stackoverflow.com/questions/16551734/can-a-monad-be-a-comonad).
## Yoneda / CoYoneda
- [SO question: Step-by-step explanation of coyoneda](http://stackoverflow.com/questions/24000465/step-by-step-deep-explain-the-power-of-coyoneda-preferably-in-scala-throu).
2015-03-20 01:19:35 +00:00
- Free monads for Less, una sequenza di tre articoli di Edward Kmett
2015-03-15 17:53:52 +00:00
* [Part 1: Codensity](http://comonad.com/reader/2011/free-monads-for-less/).
* [Part 2: Yoneda](http://comonad.com/reader/2011/free-monads-for-less-2/).
* [Part 3: Yielding IO](http://comonad.com/reader/2011/free-monads-for-less-3/).
2015-03-20 01:19:35 +00:00
## Propositions vs. Judgments (computazione)
2015-03-15 17:53:52 +00:00
- [StackExchange question: What is the difference between propositions and judgements](http://cstheory.stackexchange.com/questions/9826/what-is-the-difference-between-propositions-and-judgments).
- [Lecture notes from a short, three lecture course](http://www.ae-info.org/attach/User/Martin-L%C3%B6f_Per/OtherInformation/article.pdf)
2015-03-20 01:19:35 +00:00
# Tipi dipendenti
2015-03-15 17:53:52 +00:00
2015-03-20 01:19:35 +00:00
- [Grokking sum types, value constructors, and type constructors](http://bitemyapp.com/posts/2014-04-05-grokking-sums-and-constructors.html) strizzate gli occhi.
2015-03-15 17:53:52 +00:00
- [Lightweight Dependent-type Programming](http://okmij.org/ftp/Computation/lightweight-dependent-typing.html).
- [Idris programming language](http://www.idris-lang.org/).
2015-03-20 01:19:35 +00:00
# Linkare binari staticamente
2015-03-15 17:53:52 +00:00
- [Static linking](https://wiki.haskell.org/Web/Literature/Static_linking)
- [Static linking with GHC on Arch Linux](http://www.edofic.com/posts/2014-05-03-ghc-arch-static.html)
- [Statically linking Linux binaries for ARM & MIPS](http://stackoverflow.com/questions/14270177/ghc-statically-linking-linux-binaries-for-arm-mips-processors)
- [Statically link GMP using GHC and LLVM](http://stackoverflow.com/questions/10539857/statically-link-gmp-to-an-haskell-application-using-ghc-llvm)
2015-03-20 01:19:35 +00:00
## Dialoghi
2015-03-15 17:53:52 +00:00
2015-03-22 16:23:51 +00:00
> Disponibile in questo repository [qui](dialogues.md).
2015-03-15 17:53:52 +00:00
2015-03-20 01:27:53 +00:00
Questi sono in realtà importanti e utili. Leggeteli per approfondimenti su una varietà di argomenti.
2015-03-15 17:53:52 +00:00