Haskell (linguaggio di programmazione): differenze tra le versioni

Contenuto cancellato Contenuto aggiunto
m Eliminato il parametro "Ultima versione" nel template "Linguaggio di programmazione"
FrescoBot (discussione | contributi)
m Bot: numeri di pagina nei template citazione
 
(3 versioni intermedie di 3 utenti non mostrate)
Riga 9:
|estensione = .hs, .lhs
|influenzato_da = Clean, FP, Gofer, Hope e Hope+, Id, ISWIM, KRC, [[Lisp]], Miranda, ML e Standard ML, Orwell, SASL, SISAL, [[Scheme]]
|ha_influenzato = Agda, Bluespec, [[C++11]]/Concepts, [[C sharp|C#]]/[[LINQ]], CAL, Cayenne, Clean, [[Clojure]], CoffeeScript, Curry, [[D (linguaggio)|D]], Elm, Epigram, Escher, [[F Sharp|F#]], Isabelle, [[Java (linguaggio di programmazione)|Java]]/[[Generics Java|Generics]], Kaya, [[Mercury (linguaggio)|Mercury]], Omega, [[Perl 6]], [[Python]], Qi, [[Scala (linguaggio di programmazione)|Scala]], Timber, [[Visual Basic|Visual Basic 9.0]], [[Rust (linguaggio di programmazione) | Rust]]
|sistema_operativo = [[Multipiattaforma]]
|sito_web = [https://www.haskell.org/ Haskell Language]
}}
'''Haskell''' è un [[linguaggio di programmazione]] [[Linguaggio funzionale|puramente funzionale]] [[General purpose|general-purpose]] creato da un apposito comitato alla fine degli [[Anni 1980|anni ottanta]] principalmente per analizzare le caratteristiche dei linguaggi<ref>{{Citazione|Noi volevamo un linguaggio che potesse essere usato, oltre agli altri scopi, per studiare le caratteristiche del linguaggio;|A History of Haskell: Being Lazy With Class, Simon Peyton Jones, Paul Hudak, John Hughes, Philip Wadler|We wanted a language that could be used, among other purposes, for research into language features;|lingua = EN}}</ref>. È stato chiamato così in onore del matematico e logico statunitense [[Haskell Curry]].
Line 17 ⟶ 16:
== Storia ==
=== L'inizio della programmazione funzionale ===
{{Per approfondire|Programmazione funzionale}}Tutto iniziò nel [[1978]] con il discorso di John Backus intitolato ''"Can Programming be liberated from the Von Neumann style?"''<ref>[{{cita testo|url=http://worrydream.com/refs/Backus-CanProgrammingBeLiberated.pdf |titolo=Can Programming Be Liberated from Von Neumann Style?]}}</ref> con il quale si proponeva la programmazione funzionale non solo come una mera curiosità matematica, bensì anche per scopi industriali.
 
Tra gli anni [[Anni 1970|settanta]] ed [[Anni 1980|ottanta]] del [[XX secolo]], vennero implementati diversi linguaggi funzionali, seppur ancora strettamente legati ai linguaggi imperativi, che si basavano più sul concetto computazionale del [[lambda calcolo]]. Alcuni esempi possono essere [[Scheme]], e i vari dialetti [[ML (linguaggio di programmazione)|ML]] di questo periodo.
Line 34 ⟶ 33:
* Basato su idee con ampio consenso;
* Ridurre la diversità nei linguaggi funzionali.
Dopo due anni, cioè il 1º aprile [[1990]], venne pubblicata la prima versione del linguaggio che verrà chiamata Haskell 1.0 in onore a [[Haskell Curry]], e l'inizio della pubblicazione inizia proprio con una citazione del famoso matematico statunitense<ref>{{Pdf|sorgente = [https://www.haskell.org/definition/haskell-report-1.0.ps.gz Report of the Programming Language Haskell A Non-Strict, Purely Functional Language, Version 1.0, 1 April 1990]}} {{Cita web|autore = |url = https://www.haskell.org/definition/haskell-report-1.0.ps.gz|titolo = Report of the Programming Language Haskell A Non-Strict, Purely Functional Language, Version 1.0|accesso = |data = 1990}}</ref>.
 
=== Haskell 98 ===
Line 42 ⟶ 41:
 
=== Haskell 2010 ===
Nel [[2006]] fu creato il comitato '''Haskell Prime''' ('''Haskell'''')<ref>{{Cita web|url = https://prime.haskell.org/|titolo = Haskell Prime|accesso = 31 gennaio 2016|sito = prime.haskell.org|urlarchivio = https://web.archive.org/web/20160220103915/https://prime.haskell.org/|dataarchivio = 20 febbraio 2016|urlmorto = sì}}</ref>, il cui scopo è di produrre una revisione dello standard del 1998.
 
Nel [[2009]] è stata annunciata una nuova versione di Haskell chiamata Haskell 2010<ref>{{Cita web|nome = Simon|cognome = Marlow|url = https://mail.haskell.org/pipermail/haskell/2009-November/021750.html|titolo = [Haskell] Announcing Haskell 2010|accesso = 30 gennaio 2016|data = 24 novembre 2009}}</ref>. Le modifiche principali apportate furono la rimozione dell'''n+k pattern'' e l'implementazione di numerose espressioni semplificate o anche chiamate [[zucchero sintattico]] (''syntactic sugar''), come la notazione ''do'', le ''guards'', l'espressione ''if then else''.
 
== Caratteristiche ==
=== Valutazione Lazy ===
{{Per approfondire|Valutazione lazy}}
 
Tra le sue funzionalità Haskell presenta la [[valutazione pigra]], le [[Funzione anonima|espressioni lambda]], ''[[pattern matching]]'', [[comprensione di lista]], classi di tipi, e [[Polimorfismo (informatica)|polimorfismo]]. È un linguaggio puramente funzionale, il che significa che le funzioni sono in genere pure, ovvero senza [[Effetto collaterale (informatica)|effetti collaterali]]. Esiste un costrutto diverso apposta per rappresentare gli effetti collaterali, ed è ortogonale alle funzioni. Una funzione pura può restituire un effetto collaterale che è successivamente eseguito, imitando così le funzioni impure degli altri linguaggi.
=== Tipizzazione statica ===
{{Per approfondire|Tipizzazione statica}}
 
Haskell ha un sistema di tipi forte e statico, basato sull'inferenza di Hindley-Milner. La principale innovazione portata in questo campo sono le classi di tipi, concepite in origine come maniera di principio per introdurre il [[Overloading|sovraccarico]],<ref name="wadler89">{{Cita libro|cognome1=Wadler|nome1=P.|nome2=S. |cognome2=Blott|titolo=Proceedings of the 16th ACM SIGPLAN-SIGACT symposium on Principles of programming languages - POPL '89 |capitolo=How to make ad-hoc polymorphism less ad hoc |anno=1989|editore=[[Association for Computing Machinery|ACM]]|pp=60-76|doi=10.1145/75277.75283|isbn=978-0-89791-294-5}}</ref> ma nel seguito usate in molti altri ambiti.<ref name="hallgren01">{{Cita pubblicazione|cognome=Hallgren|nome=T.|data=gennaio 2001|titolo=Fun with Functional Dependencies, or Types as Values in Static Computations in Haskell|rivista=Proceedings of the Joint CS/CE Winter Meeting|città=Varberg, Sweden|url=http://www.cs.chalmers.se/~hallgren/Papers/wm01.html}}</ref>
=== Puramente funzionale ===
 
{{...|linguistica}}
Il costrutto che rappresenta gli effetti collaterali è un esempio di [[Monade (informatica)|monade]]: un quadro generale che può modellizzare vari calcoli come la gestione degli errori, il [[Algoritmo nondeterministico|nondeterminismo]], l'[[Parsing|analisi sintattica]] e la memoria transazionale. Sono definite come tipi di dato ordinari, ma Haskell fornisce un po' di zucchero sintattico per facilitarne l'uso.
 
Haskell ha una specifica aperta e pubblica e ne esistono numerose implementazioni. La principale, il [[Glasgow Haskell Compiler]] (GHC), è sia un [[Interprete (informatica)|interprete]] sia un [[compilatore]] di [[codice nativo]] e gira su molte piattaforme. GHC è noto per il suo ricco sistema di tipi che incorpora innovazioni recenti come i tipi di dati algebrici generalizzati e le famiglie di tipi. Il Computer Language Benchmarks Game ne evidenzia anche l'implementazione ad alte prestazioni della concorrenza e del parallelismo.<ref name="shootout">{{cita testo|url=https://benchmarksgame-team.pages.debian.net/benchmarksgame/fastest/haskell.html|titolo=Computer Language Benchmarks Game}}</ref>
 
Intorno al linguaggio esiste una comunità attiva e in crescita e più di 5.400 librerie e strumenti liberi di terze parti sono disponibili in rete nell'archivio di pacchetti Hackage.<ref name="hackage-stats">{{cita web|url=http://hackage.haskell.org/cgi-bin/hackage-scripts/stats|urlarchivio=https://web.archive.org/web/20130503114836/http://hackage.haskell.org/cgi-bin/hackage-scripts/stats|titolo=HackageDB statistics|accesso=26 giugno 2013}}</ref>
 
== Codice di esempio ==
Line 134 ⟶ 135:
 
== Implementazioni ==
* '''''[[Glasgow Haskell Compiler]]''''' ([{{cita testo|url=https://www.haskell.org/ghc/ |titolo=The Glasgow Haskell Compiler]|postscript=nessuno}}), o '''GHC''', costituisce il compilatore Haskell più diffuso ad oggi, grazie a numerosi ''plugin'' e all'efficienza tale che gli permette un confronto diretto con il [[C++]], in alcuni casi<ref>{{Cita web|url = https://benchmarksgame.alioth.debian.org/u64q/compare.php?lang=ghc&lang2=gpp|titolo = Haskell GHC vs C++ g++ (64-bit Ubuntu quad core) {{!}} Computer Language Benchmarks Game|accesso = 30 gennaio 2016|sito = benchmarksgame.alioth.debian.org|urlarchivio = https://web.archive.org/web/20160416220709/http://benchmarksgame.alioth.debian.org/u64q/compare.php?lang=ghc&lang2=gpp|dataarchivio = 16 aprile 2016|urlmorto = sì}}</ref>''.''
* [[Utrecht Haskell Compiler]] ('''UHC'''), sviluppato dall'[[Università di Utrecht]].
 
=== Implementazioni obsolete ===
Segue un elenco di implementazioni diventate ormai obsolete:
* '''''[[Hugs]]''''' ([{{cita testo|url=https://www.haskell.org/hugs/ |titolo=Hugs 98]|postscript=nessuno}}), o ''Haskell User's Gofer System'', è un interprete ''[[bytecode]]'' portabile per numerose piattaforme. Grazie anche ad un'interfaccia grafica e alla modalità interattiva, costituisce un mezzo eccellente per apprendere il linguaggio Haskell. Da quando è stato creato GHCi, l'interprete interattivo di GHC, non viene più usato.
* '''''nhc98''''' ([{{cita testo|url=http://www.cs.york.ac.uk/fp/nhc98/ |titolo=nhc98] {{Webarchive|urlpostscript=nessuno|urlarchivio=https://web.archive.org/web/20050205041736/http://www.cs.york.ac.uk/fp/nhc98/ |date=5 febbraio 2005 }}), compilatore ''bytecode'' particolarmente adatto a macchine un po' datate grazie al ridotto uso di memoria.
* '''''yhc''''' ([{{cita testo|url=http://www-users.cs.york.ac.uk/~ndm/yhc/ |titolo=Neil Mitchell - Yhc] {{Webarchive|urlpostscript=nessuno|urlarchivio=https://web.archive.org/web/20060203214652/http://www-users.cs.york.ac.uk/~ndm/yhc/ |date=3 febbraio 2006 }}), o ''York Haskell Compiler'', è un [[Fork (sviluppo software)|fork]] di nhc98 mirato ad aumentarne le performance e la portabilità.
* '''''jhc''''' ([{{cita testo|url=http://repetae.net/john/computer/jhc/ |titolo=jhc]|postscript=nessuno}}) è un compilatore mirato a produrre codice ottimizzato il più possibile, ma allo stato attuale è da considerarsi sperimentale.
 
== Applicazioni ==
Line 160 ⟶ 161:
Tra le librerie per lo sviluppo lato server troviamo:
 
* wai: Haskell Web Application Interface, un insieme di interfacce per lo sviluppo di applicazioni web;<ref>[{{cita testo|url=http://www.yesodweb.com/book/web-application-interface |titolo=Web Application Interface]}}</ref>
* warp: un web server veloce e leggero per applicazioni che implementano le interfacce di wai;<ref>[{{cita testo|url=https://www.stackage.org/package/warp |titolo=warp]}}</ref>
* scotty: un framework web ispirato da Sinatra, pensato per essere semplice;<ref>[{{cita testo|url=https://github.com/scotty-web/scotty/wiki/Scotty-Tutorials-&-Examples |titolo=Scotty Tutorials & Examples]}}</ref>
* spock: più leggero dei framework detti enterprise, ma avente più funzionalità di scotty;<ref>[{{cita testo|url=https://www.spock.li/ |titolo=spock]}}</ref>
* yesod: un framework enterprise per lo sviluppo di applicazioni web;<ref>[{{cita testo|url=http://www.yesodweb.com/ |titolo=Yesod]}}</ref>
* snap: un altro framework enterprise;<ref>[{{cita testo|url=https://github.com/snapframework/snap-server |titolo=snap-server]}}</ref>
* happstack-server: un altro framework enterprise;<ref>[{{cita testo|url=http://www.happstack.com/page/view-page-slug/1/happstack |titolo=Happstack]}}</ref>
* servant: una libreria che usa i tipi per definire le interfacce REST.<ref>[{{cita testo|url=https://haskell-servant.github.io/ |titolo=Servant]}}</ref>
 
Librerie grafiche e lo sviluppo di videogiochi:
Line 180 ⟶ 181:
== Bibliografia ==
* {{Cita testo|autore = Paul Hudak, John Hughes, Simon Peyton Jones, Philip Wadler|titolo = A history of Haskell: Being Lazy With Class|editore = |città = San Diego, CA|data = 2007}}
* {{Cita libro|autore = Graham Hutton|titolo = Programming in Haskell|url = https://archive.org/details/programminghaske00libg|anno = 2007|editore = Cambridge University Press|città = |pp = [{{cita testo|url=https://archive.org/details/programminghaske00libg/page/n182 |titolo=170]|postscript=nessuno}}|ISBN = 978-0-521-87172-3}}
 
== Voci correlate ==
Line 203 ⟶ 204:
== Collegamenti esterni ==
* {{Collegamenti esterni}}
* {{En}}{{Cita web|lingua=En|autore = |url = https://www.haskell.org/hoogle/|titolo = Hoogle|accesso = |data = }}
* {{En}}{{Cita web|lingua=En|autore = |url = http://hayoo.fh-wedel.de/|titolo = Hayoo|accesso = |data = |urlarchivio = https://web.archive.org/web/20160128185255/http://hayoo.fh-wedel.de/|dataarchivio = 28 gennaio 2016|urlmorto = sì}}
 
=== Tutorial ===
* {{Cita web|autore = |url = https://github.com/bitemyapp/learnhaskell/blob/master/guide-it.md|titolo = Learn Haskell|accesso = |data = }}
* {{cita web|url=https://www.haskell.org/haskellwiki/|titolo=The Haskell Wiki|lingua=en}}
* {{En}}{{Cita web|lingua=En|autore = |url = https://www.schoolofhaskell.com/|titolo = School of Haskell|accesso = |data = }}
 
=== Libri di testo ===
* {{cita web|url=http://learnyouahaskell.com/chapters|titolo=Learn You a Haskell for Great Good!|lingua=en}}
* {{En}}{{Cita web|lingua=En|autore = Bryan O'Sullivan, Don Stewart, John Goerzen|url = http://book.realworldhaskell.org/|titolo = Real World Haskell|accesso = |editore = O'Reilly Media|data = 2008}}
 
=== Community ===