Haskell

Introduzione

Haskell è un linguaggio puramente funzionale. Creato da un comitato nella seconda metà degli anni 80 partendo da un linguaggio preesistente che si chiamava Miranda, ha raggiunto nel tempo una discreta popolarità pur senza mai  raggiungere vertici di eccellenza assoluta in termini di utilizzo. Questo fatto non deve sorprendere: l'approccio 100% funzionale è sembrato, direi fino a pochi anni fa, indirizzato ad un certo ambito scientifico e non adatto alla maggior parte dei programmatori che proprio in quel periodo si dirigevano massicciamente sulle sponde della programmazione a oggetti proposta da C++ e di lì a pochi anni rafforzata ulteriormente dall'arrivo di Java. Haskell invece è pensato specificatamente verso l'ambito funzionale e questo rende le cose un po' diverse. Il fatto di doversi concentrare su una valutazione di funzioni piuttosto che su una sequenza di istruzioni cambia profondamente le carte in tavola. Oltre all'aspetto un po' anticonformista proposto a peggiorare le cose ci pensa anche la non banalità del linguaggio stesso che presenta difficoltà non indifferenti non tanto per il suo apprendimento quanto per il suo uso ottimale. Ci vuole un po' di pazienza e di esperienza sul campo per capirne i segreti e i meccanismi. Va peraltro detto, riguardo alla sua impostazione, che molti moderni linguaggi si sono recentemente un po', come dire, pentiti di aver tralasciato completamente la programmazione funzionale e le versioni più recenti ad esempio di C#, VBNet, Java ed altri hanno aggiunto costrutti per potersi avvicinare a questo tipo di programmazione. Anche C++ nel recentissimo draft che costituisce la guida per la definizione di C++11 ha introdutto delle facilities per programmare in modo funzionale. Inoltre molti linguaggi nati più o meno recentemente (Scala, Fantom. Groovy e altri) chi più e chi meno hanno tutti una certa propensione in questo senso. La programmazione funzionale ha i suoi vantaggi che, piano piano, stanno venendo a galla. Haskell in questo senso è considerato un po' il principe dei linguaggi funzionali e gli fanno buona compagnia altri nomi importanti come OCaml, Scheme, Erlang o i più recenti Clojure ed F# (quest'ultimo specificatamente creato proprio da Microsoft e legato al mondo .Net).
Haskell è un linguaggio general purpose basato su tipizzazione forte, polimorfica e statica e, come detto, persegue l'approccio funzionale puro. E' prevista la cosiddetta lazy evaluation (valutazione pigra) ovvero le funzioni vengono valutate solo quando serve, al momento insomma, tanto che si parla di valutazione differita più propriamente in italiano (C/C++ e Java, per dirne un paio, hanno un approccio opposto detto "strict", stretto). Haskell ha come poprio simbolo, come logo, la lettera greca lambda ( λ ) stilizzata a sintetizzare il suo fondamento sul calcolo lambda, un formalismo matematico molto usato per la definizione delle funzioni. Ovviamente abbiamo anche l'inferenza di tipo, altra importante caratteristica che molti linguaggi hanno aggiunto successivamente alla loro nascita (C#, C++ per esempio), a sottolinearne il riconoscimento della sua importanza. E' un linguaggio privo di effetti collaterali nel senso che usa un meccanismo basato su monadi per isolare le parti "pure" da quelle con effetti collaterali. Altri termini legati ad Haskell sono il pattern matching, ovvero la corrispondenza di una sottosequenza ad un certo schema (ad esempio parlando di una stringa sarà agevole verificare la congruenza di una sottostringa a piacere ad un formato noto) e la list comprehension, la creazioni di liste mappate su altre liste.
Come qualunque altro linguaggio Haskell si porta dietro molte promesse, miglioramento della produttività, miglior manutenibilità del codice, facilitazioni nel commettere meno errori ecc... alzi la mano chi ha visto la presentazione di un linguaggio che non facesse, più o meno le stesse promesse :-). Bisogna sempre provare per credere. Certamente gli aspetti interessanti non mancano purchè, come detto, non si diventi nostalgici del mondo a oggetti. Al di là di questo tuttavia è anche vero che a muovere le cose c'era il desiderio di mettere ordine nel mondo della programmazione funzionale e direi anzi che quella è stata la molla principale.
Nel corso degli anni questo linguaggio ha seguito una profonda e continua evoluzione tanto nel 1997 è stato deciso di definire il perimetro formale di una versione stabile ed è così che è arrivato Haskell 98, il draft guida per tanti anni pur con qualche ulteriore ritocco successivo. Successivamente importanti modifiche sono state apportate dopo il 2005 e il draft corrente è Haskell 2010, ma si sta lavorando ad un ulteriore standard che dovrebbe essere datato 2012. Queste linee guida sono obbligatorie per tutte le implementazioni che si vogliano fare del linguaggio. Il Glasgow Haskell Compiler al momento costituisce lo standard de facto ed è lo strumento che userò io e che invito ad usare, lo troverete facilmente ed ancora più facilmente potrete usarlo.
Come sempre non sono tutte rose e fiori. Gli stessi creatori di haskell sono comunque espliciti nell'affermare che la loro creatura non è competitiva rispetto, ad esempio, al C sul piano delle prestazioni (come quasi nessun linguaggio lo è, l'unico che si avvicina pare sia il poco conosciuto ATS). Questo può essere un problema in alcuni casi. A mitigare la cosa va aggiunto che Haskell possiede una interfaccia standard per poter utilizzare codice scritto in altri linguaggi, tra cui il C. L'uso di questa foreign function interface (FFI) può essere preso in esame se le performance del vostro programma diventano un vero prolema. Certo dovete conoscere un altro linguaggio, anche questo è vero. Comunque il gap prestazionale rispetto ai migliori non è così avvilente e comunque Haskell è messo parecchio meglio rispetto a molti linguaggi dinamici alla moda, come Ruby.
Tra gli aspetti positivi c'è sicuramente da annoverare la sua completa gratuità. E' una cosa comune ai linguaggi di programmazione di oggi ma comunque va ricordata. Sulla rete è attiva una comunità molto vivace che può essere utile per chiarire molti dubbi.
In attesa di approfondimenti, salutiamoci:

  Hello, World!
1 main = putStrLn "Hello, World!"