Quindi vuoi essere un programmatore funzionale (parte 6)

Fare il primo passo per comprendere i concetti di Programmazione funzionale è il passo più importante e talvolta il più difficile. Ma non deve essere. Non con la giusta prospettiva.

Parti precedenti: Parte 1, Parte 2, Parte 3, Parte 4, Parte 5

E adesso?

Ora che hai imparato tutte queste nuove fantastiche cose, probabilmente stai pensando: "E adesso? Come posso usarlo nella mia programmazione quotidiana? ”

Dipende. Se riesci a programmare in un linguaggio funzionale puro come Elm o Haskell, puoi sfruttare tutte queste idee. E queste lingue lo rendono facile.

Se puoi programmare solo in una lingua imperativa come Javascript, come molti di noi devono, allora puoi comunque usare molto di ciò che hai imparato, ma ci sarà molta più disciplina richiesta.

Javascript funzionale

Javascript ha molte caratteristiche che ti consentono di programmare in modo più funzionale. Non è puro ma puoi ottenere un po 'di immutabilità nella lingua e ancora di più con le biblioteche.

Non è l'ideale, ma se devi usarlo, allora perché non ottenere alcuni dei vantaggi di un linguaggio funzionale?

Immutabilità

La prima cosa da considerare è l'immutabilità. In ES2015, o ES6 come veniva chiamato, esiste una nuova parola chiave chiamata const. Ciò significa che una volta impostata una variabile, non può essere ripristinata:

const a = 1;
a = 2; // questo genererà un TypeError in Chrome, Firefox o Node
       // ma non in Safari (circa 10/2016)

Qui a è definito come costante e pertanto non può essere modificato una volta impostato. Questo è il motivo per cui a = 2 genera un'eccezione (ad eccezione di Safari).

Il problema con const in Javascript è che non va abbastanza lontano. L'esempio seguente illustra i suoi limiti:

const a = {
    x: 1,
    y: 2
};
a.x = 2; // NESSUNA ECCEZIONE!
a = {}; // questo genererà un TypeError

Nota come a.x = 2 NON genera un'eccezione. L'unica cosa che è immutabile con la parola chiave const è la variabile a. Tutto ciò a cui punta può essere mutato.

Questo è terribilmente deludente perché avrebbe reso Javascript molto migliore.

Quindi, come possiamo ottenere l'immutabilità in Javascript?

Sfortunatamente, possiamo farlo solo tramite una libreria chiamata Immutable.js. Questo può darci una migliore immutabilità ma, purtroppo, lo fa in un modo che rende il nostro codice più simile a Java che a Javascript.

Currying e composizione

All'inizio di questa serie, abbiamo imparato a scrivere funzioni che sono al curry. Ecco un esempio più complesso:

const f = a => b => c => d => a + b + c + d

Si noti che abbiamo dovuto scrivere la parte al curry a mano.

E per chiamare f, dobbiamo scrivere:

console.log (f (1) (2) (3) (4)); // stampa 10

Ma sono abbastanza parentesi per far piangere un programmatore Lisp.

Esistono molte librerie che semplificano questo processo. Il mio preferito è Ramda.

Usando Ramda ora possiamo scrivere:

const f = R.curry ((a, b, c, d) => a + b + c + d);
console.log (f (1, 2, 3, 4)); // stampa 10
console.log (f (1, 2) (3, 4)); // stampa anche 10
console.log (f (1) (2) (3, 4)); // stampa anche 10

La definizione della funzione non è molto migliore ma abbiamo eliminato la necessità di tutte quelle parentesi. Si noti che possiamo applicare tutti i parametri che desideriamo ogni volta che invochiamo f.

Usando Ramda, possiamo riscrivere la funzione mult5AfterAdd10 dalla Parte 3 e Parte 4:

const add = R.curry ((x, y) => x + y);
const mult5 = valore => valore * 5;
const mult5AfterAdd10 = R.compose (mult5, add (10));

Si scopre che Ramda ha molte funzioni di supporto per fare questo genere di cose, ad es. R.add e R.multiply, il che significa che possiamo scrivere meno codice:

const mult5AfterAdd10 = R.compose (R.multiply (5), R.add (10));

Mappa, filtra e riduci

Ramda ha anche le sue versioni di mappa, filtro e riduzione. Sebbene queste funzioni esistano in Array.prototype in Javascript vanilla, le versioni di Ramda sono curry:

const isOdd = R.flip (R.modulo) (2);
const onlyOdd = R.filter (isOdd);
const isEven = R.complement (isOdd);
const onlyEven = R.filter (isEven);
numeri const = [1, 2, 3, 4, 5, 6, 7, 8];
console.log (onlyEven (numeri)); // stampa [2, 4, 6, 8]
console.log (onlyOdd (numeri)); // stampa [1, 3, 5, 7]

R.modulo accetta 2 parametri. Il primo è il dividendo (ciò che viene diviso) e il secondo è il divisore (ciò che stiamo dividendo).

La funzione isOdd è solo il resto della divisione per 2. Un resto di 0 è falso, non dispari, e un resto di 1 è veritiero, dispari. Abbiamo invertito il primo e il secondo parametro di modulo in modo da poter specificare 2 come divisore.

La funzione isEven è solo il complemento di isOdd.

La funzione onlyOdd è la funzione filtro con predicato (una funzione che restituisce un valore booleano) di isOdd. Sta aspettando l'elenco dei numeri, il suo parametro finale, prima che venga eseguito.

La funzione onlyEven è un filtro che utilizza isEven come predicato.

Quando passiamo i numeri a onlyEven e onlyOdd, isEven e isOdd ottengono i loro parametri finali e possono finalmente eseguire la restituzione dei numeri che ci aspetteremmo.

Carenze di Javascript

Con tutte le librerie e i miglioramenti del linguaggio che hanno ottenuto Javascript finora, soffre ancora per il fatto che è un linguaggio imperativo che sta cercando di essere tutto per tutti.

La maggior parte degli sviluppatori di front-end sono bloccati utilizzando Javascript nel browser perché è stata l'unica scelta per così tanto tempo. Ma molti sviluppatori si stanno allontanando dalla scrittura diretta di Javascript.

Invece, stanno scrivendo in una lingua diversa e compilando, o più precisamente, eseguendo la traspilazione in Javascript.

CoffeeScript è stato uno dei primi di questi linguaggi. E ora, Typescript è stato adottato da Angular 2. Babel può anche essere considerato un transpiler per Javascript.

Sempre più persone stanno adottando questo approccio nella produzione.

Ma queste lingue sono iniziate con Javascript e l'hanno solo migliorato leggermente. Perché non andare fino in fondo e traspilare in Javascript da un linguaggio funzionale puro?

Olmo

In questa serie, abbiamo esaminato Elm per comprendere la programmazione funzionale.

Ma cos'è Elm? E come posso usarlo?

Elm è un linguaggio funzionale puro che si compila in Javascript in modo da poterlo utilizzare per creare applicazioni Web usando The Elm Architecture, alias TEA (questa architettura ha ispirato gli sviluppatori di Redux).

I programmi Elm NON presentano errori di runtime.

Elm viene utilizzato nella produzione in aziende come NoRedInk, dove Evan Czapliki, il creatore di Elm, ora lavora (in precedenza ha lavorato per Prezi).

Guarda questo discorso, 6 months of Elm in Production, di Richard Feldman di NoRedInk e Elm evangelist per ulteriori informazioni.

Devo sostituire tutto il mio Javascript con Elm?

No. È possibile sostituire in modo incrementale le parti. Vedi questo post sul blog, Come usare Elm at Work, per saperne di più.

Perché imparare l'olmo?

  1. La programmazione in un linguaggio funzionale puro è sia limitativa che liberatrice. Limita ciò che puoi fare (principalmente impedendoti di spararti al piede) ma allo stesso tempo ti libera da bug e cattive decisioni di progettazione poiché tutti i programmi Elm seguono The Elm Architecture, un modello funzionalmente reattivo.
  2. La programmazione funzionale ti renderà un programmatore migliore. Le idee in questo articolo sono solo la punta dell'iceberg. Devi davvero vederli in pratica per apprezzare davvero come i tuoi programmi si ridurranno in dimensioni e cresceranno in stabilità.
  3. Javascript è stato inizialmente creato in 10 giorni e poi patchato negli ultimi due decenni per diventare un linguaggio di programmazione un po 'funzionale, un po' orientato agli oggetti e completamente imperativo.
    Elm è stato progettato utilizzando quanto appreso negli ultimi 30 anni di lavoro nella comunità di Haskell, che si basa su decenni di lavoro in matematica e informatica.
    L'Elm Architecture (TEA) è stata progettata e perfezionata nel corso degli anni ed è il risultato della tesi di Evan in Programmazione reattiva funzionale. Guarda Controlling Time and Space per apprezzare il livello di pensiero che è andato nella formulazione di questo design.
  4. Elm è progettato per gli sviluppatori Web front-end. Ha lo scopo di rendere le loro vite più facili. Guarda Let's essere mainstream per comprendere meglio questo obiettivo.

Il futuro

È impossibile sapere che cosa riserva il futuro, ma possiamo fare alcune ipotesi colte. Ecco alcuni dei miei:

Ci sarà un chiaro spostamento verso le lingue che vengono compilate in Javascript.
Le idee di programmazione funzionale che esistono da oltre 40 anni verranno riscoperte per risolvere i nostri attuali problemi di complessità del software.
Lo stato dell'hardware, ad es. gigabyte di memoria economica e processori veloci, renderanno praticabili le tecniche funzionali.
Le CPU non diventeranno più veloci ma il numero di core continuerà ad aumentare.
Lo stato mutevole sarà riconosciuto come uno dei maggiori problemi nei sistemi complessi.

Ho scritto questa serie di articoli perché credo che la programmazione funzionale sia il futuro e perché ho lottato negli ultimi due anni per impararlo (sto ancora imparando).

Il mio obiettivo è aiutare gli altri a imparare questi concetti più facilmente e più velocemente di me e aiutare gli altri a diventare programmatori migliori in modo che possano avere più carriere commercializzabili in futuro.

Anche se la mia previsione che Elm sarà un linguaggio enorme in futuro è sbagliata, posso affermare con certezza che la Programmazione Funzionale e Elm saranno sulla traiettoria di qualunque cosa il futuro riserva.

Spero che dopo aver letto questa serie, ti sentirai più sicuro delle tue capacità e della tua comprensione di questi concetti.

Ti auguro buona fortuna nei tuoi sforzi futuri.

Se ti è piaciuto, fai clic su in basso in modo che altre persone lo vedano qui su Medium.

Se vuoi unirti a una comunità di sviluppatori web che si apprendono e si aiutano a vicenda nello sviluppo di app Web utilizzando la Programmazione funzionale in Elm, controlla il mio gruppo Facebook, Impara la programmazione Elm https://www.facebook.com/groups/learnelm/

Il mio Twitter: @cscalfani