Haskell (linguaggio di programmazione): differenze tra le versioni

Contenuto cancellato Contenuto aggiunto
m No2 ha spostato la pagina Haskell (linguaggio) a Haskell (linguaggio di programmazione): Disambiguante maggioritario nella categoria
FrescoBot (discussione | contributi)
m Bot: numeri di pagina nei template citazione
 
(8 versioni intermedie di 6 utenti non mostrate)
Riga 4:
|autore = Simon Peyton Jones, Lennart Augustsson, Dave Barton, Brian Boutel, Warren Burton, Joseph Fasel, Kevin Hammond, Ralf Hinze, Paul Hudak, John Hughes, Thomas Johnsson, Mark Jones, John Launchbury, Erik Meijer, John Peterson, Alastair Reid, Colin Runciman, Philip Wadler
|data = 1990
|versione = Haskell 2010 (luglio 2010)
|utilizzo = general-purpose
|paradigmi = [[Programmazione funzionale|funzionale]], [[Modularità (informatica)|modulare]]
|tipizzazione = [[Tipizzazione forte|forte]], [[Tipizzazione statica|statica]]
|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 18 ⟶ 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 35 ⟶ 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 43 ⟶ 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 ==
=== [[Hello world|Hello, world!]] ===
Il seguente esempio stampa il testo "Hello World".
<syntaxhighlight lang="haskell">
Riga 71:
</syntaxhighlight>
 
=== Calcolo del [[fattoriale]] ===
Classica definizione del fattoriale con ''pattern matching:''
<syntaxhighlight lang="haskell">
Riga 81:
</syntaxhighlight>
 
=== Calcolo della [[successione di Fibonacci]] ===
Definizione con ''pattern matching'' per numeri naturali e applicazione di ''higher order functions'':
<syntaxhighlight lang="haskell">
Riga 115:
</syntaxhighlight>
 
=== Algoritmo di ordinamento generico [[quicksort]] ===
Falsa<ref>{{Cita web|url = https://stackoverflow.com/questions/7717691/why-is-the-minimalist-example-haskell-quicksort-not-a-true-quicksort|titolo = Why is the minimalist, example Haskell quicksort not a "true" quicksort?|accesso = 31 gennaio 2016|sito = stackoverflow.com}}</ref> implementazione polimorfa con ''pattern matching'' e ''list comprehension'' :
<syntaxhighlight lang="haskell">
Riga 125:
l2 = [z | z <- xs, z>=x]
</syntaxhighlight>
=== [[Crivello di Eratostene]] ===
<syntaxhighlight lang="haskell">
primes = dropall [2..]
Riga 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]|postscript=nessuno|urlarchivio=https://web.archive.org/web/20050205041736/http://www.cs.york.ac.uk/fp/nhc98/ }}), 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 ==
Riga 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:
Riga 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 ==
Riga 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 ===