Come un linguaggio di programmazione puramente funzionale può cambiarti la vita.

Credo che tutti dovrebbero imparare Haskell, anche se non lo utilizzerai nel tuo lavoro. È bello e cambia il modo di pensare.

Haskell chi?

Prima le presentazioni: cos'è Haskell? Haskell è un linguaggio di programmazione pigro e puramente funzionale.

Cos'è quello adesso?

Bene, pigro significa che Haskell non eseguirà immediatamente i tuoi comandi, ma attenderà fino a quando non avrai bisogno del risultato. All'inizio può sembrare strano, ma consente alcune funzioni piuttosto carine - come elenchi infiniti:

evenNumbers = [0, 2 ..]

Questo frammento dichiarerà un array contenente tutti i numeri pari. Ma come abbiamo detto, Haskell è pigro, quindi non calcolerà nulla fino a quando non sarà costretto a farlo.

prendi 10 numeri pari

Il codice restituisce i primi 10 elementi di evenNumbers, quindi Haskell calcolerà solo quelli.

Bonus: come puoi vedere, in Haskell chiami una funzione senza parentesi. Devi solo inserire il nome della funzione seguito dagli argomenti (come nel terminale, se lo desideri).

Abbiamo anche detto che Haskell è puramente funzionale. Ciò significa che, in generale, le funzioni non hanno effetti collaterali. Sono scatole nere che accettano input e sputano output senza influenzare il programma in nessun altro modo.

Bonus: questo rende i test molto più facili, perché non hai uno stato misterioso che sta per interrompere la tua funzione. Qualunque cosa la tua funzione abbia bisogno viene passata come argomento e può essere testata.

Matematica, ricorsione e Haskell entrano in un bar

Vorrei anche aggiungere che Haskell è davvero come la matematica. Mi spiego con un esempio: la sequenza di Fibonacci.

Sequenza di Fibonacci come definita in matematica e Haskell. La versione di Haskell non è affatto ottimizzata

Come puoi vedere, le definizioni sono molto simili. Troppo simile potresti dire.

Quindi dove sono i loop?

Non ne hai bisogno! Queste quattro righe sono tutto ciò che serve in Haskell per calcolare la sequenza di Fibonacci. È quasi banale. È una definizione ricorsiva, nel senso che la funzione si chiama se stessa. Per motivi di comprensione, ecco un esempio di una funzione ricorsiva:

fattoriale :: (integrale a) => a -> a
fattoriale 0 = 1
fattoriale x = x * fattoriale (x-1)

Ecco cosa fa il computer quando calcola la chiamata fattoriale 5:

fattoriale 5 = 5 * fattoriale 4
fattoriale 4 = 4 * fattoriale 3
fattoriale 3 = 3 * fattoriale 2
fattoriale 2 = 2 * fattoriale 1
fattoriale 1 = 1 * fattoriale 0
fattoriale 0 = 1
fattoriale 1 = 1 * 1 = 1
fattoriale 2 = 2 * 1 = 2
fattoriale 3 = 3 * 2 = 6
fattoriale 4 = 4 * 6 = 24
fattoriale 5 = 5 * 24 = 120

Potresti pensare che questo approccio sia inefficiente, ma non è vero. Con un po 'di attenzione puoi raggiungere una velocità simile a C, a volte anche leggermente migliore (vedi questo thread stackoverflow per ulteriori informazioni).

Aspettare! Non hai detto variabili?

Sì, Haskell non ha variabili - solo costanti. Bene, in teoria Haskell ha delle variabili. Ma li usi raramente.

Come può essere? Non puoi programmare senza variabili, è pazzesco!

Bene, molte lingue sono indispensabili. Ciò significa che la maggior parte del codice va a spiegare al computer come eseguire alcune attività. Haskell, d'altra parte, è dichiarativo. Quindi la maggior parte del codice va nella definizione del risultato desiderato (costanti ≈ definizioni). Quindi il compilatore capirà come farlo.

Come abbiamo già scoperto, le funzioni di Haskell sono pure. Non è necessario modificare lo stato e non sono necessarie variabili. Si passano i dati attraverso varie funzioni e si recupera il risultato finale.

Tipo di sistema (no non vado nel dibattito statico vs dinamico)

Durante l'apprendimento del sistema di tipi di Haskell, il primo sbalorditore per me sono stati i tipi di dati algebrici. A prima vista, sono un po 'come enumerazioni.

data Mano = Sinistra | Destra

Abbiamo appena definito un tipo di dati Mano che può assumere il valore Sinistra o Destra. Ma vediamo un esempio leggermente più complesso:

data BinTree = Vuoto
          | Foglia Int
          | Node BinTree BinTree

Stiamo definendo un albero binario, usando un tipo ricorsivo. Le definizioni dei tipi possono essere ricorsive!

Okay ho capito: Haskell è fantastico

  • Ma dove posso saperne di più? Il mio suggerimento personale è il grande libro gratuito Learn You a Haskell for Great Good
  • Ma voglio qualcosa che possa aiutarmi a trovare un lavoro! Molte delle fantastiche funzioni di Haskell possono essere utilizzate anche in JavaScript (sebbene con una sintassi leggermente più complessa e librerie aggiuntive). Per saperne di più, dai un'occhiata alla mia Introduzione pratica alla programmazione funzionale in JS.