Come obiettivo annuale mi ero proposto di imparare a programmare in F#, linguaggio fratello di C#, perchè ne avevo sentito parlare spesso mentre mi interessavo del virtual actor model framework Microsoft Orleans.
Mi aspettavo di riuscire a programmare molto velocemente, simile a quando impari React e hai già conoscenze di Angular, o Vue, e simili.
Purtroppo mi sono subito scontrato con la poca documentazione, progetti di esempio, e guide da A a Z, tipo – ad esempio – su Pluralsight.
Riuscivo a prendere informazioni un po’ qua e po’ la da siti come quello ufficiale Microsoft F#, o dal famoso https://fsharpforfunandprofit.com di Scott Wlaschin, ma poco o niente di pratico che mi permettesse di implementare delle classiche WebApi con frontend.
Mi sono perso dentro termini mai sentiti come Monad, Monoids, Endofunctor, Currying, e molte altre.
Mi sono reso conto che tutti i pattern che davo per scontato come “universali” in realtà non lo erano. In programmazione funzionale, ad esempio, la Dependency Injection non si usa! (ma perchè non è necessaria).
A questo punto mi sono reso conto che la programmazione funzionale non è solo un termine, ma un intero mondo. Ad esempio LINQ in C# è stato implementato prendendo concetti della programmazione funzionale, e adattati alla programmazione ad oggetti in C#, dandogli una potenza, espressività e facilità di lettura, senza precedenti.
E la recente introduzione del C# pattern matching che permette di avere una completa gestione di tutte le casistiche di un set di valori, cosa fantastica, perchè permette di essere sicuri al 100% di aver coperto tutte le possibilità di una combinazione. Questo permette di avere codice “sicuro”, ma non solo per il momento in cui lo scrivi, ma anche per il futuro in caso le possibili combinazioni variassero in futuro.
Anche l’approccio intrinseco di utilizzare – in pratica – static functions, immutable functions, pure functions invece di oggetti con stato e side-effects, si adatta molto bene al mio modo di pensare. Molto in sintonia su come scrivo il codice, o come mi piacerebbe scriverlo.
Quindi ho capito che avevo bisogno di un supporto più “lineare”, ovvero che mi portasse da “A” a “Z”, quindi ho cercato dei libri sull’argomento. Purtroppo anche qui, i libri aggiornati non sono molti.
Mi sono quindi focalizzato su un libro che mi permettesse di portare le mie conoscenze di C#, in F#:
“Get programming with F# – A guide for .NET developer” by Isaac Abraham
Devo dire il libro è molto utile e raggiunge il suo scopo, ovvero mi ha permesso di capire come “tradurre” il codice C# in F#.
Il libro è fatto a moduli e tratta di tutto quello che serve a un principiante, introduce tutti i concetti principali, e anche le librerie più comuni su accesso ai dati (CSV, JSON) ma anche ai database, alle WebApi e logica di dominio.
Non mi è molto piaciuto l’approccio agli esercizi, in cui richiedeva che scrivessi tu il codice, cosa che non mi interessava fare, ma solo dare una letta per cogliere i concetti principali. Sarebbe stato gradito avere il codice stampato nel libro, per capre a cosa faceva riferimento.
Non parla di concetti più avanzati, come Monad e Railway programming, e pattern più “funzionali”. Un ottimo libro se vuoi iniziare a gestire un progetto esistente in F#, o per iniziare un nuovo progetto, ma sempre un ibrido tra programmazione ad oggetti e funzionale.
Essendo più interessato ad un approccio “totale” sulla programmazione funzionale, e interessato ai pattern “veri”, ora sto leggendo il libro “Stylish F# 6: Crafting Elegant Functional Code for .NET 6” by Kit Eason (2nd Edition)
Il libro ha un livello intermedio e ha un approccio molto più “rigoroso” sulla programmazione funzionale, che mi piace molto. Alcuni concetti sono spiegati molto semplicemente, e ha tutto il codice degli esercizi ed esempi. Sono ancora all’inizio, ma farò una recensione dedicata a suo tempo.
Fatemi sapere se avete esperienza in F# o se avete risorse interessanti!