Haskell (linguaggio di programmazione): differenze tra le versioni
Contenuto cancellato Contenuto aggiunto
Modificato il fac' per includere fac' 1 = 1, modificato il crivello di erastotene per non includere 1 che non è primo. Etichette: Modifica visuale Modifica da mobile Modifica da web per mobile |
m Bot: numeri di pagina nei template citazione |
||
(40 versioni intermedie di 25 utenti non mostrate) | |||
Riga 1:
{{Linguaggio di programmazione
|nome = Haskell
Line 5 ⟶ 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
|utilizzo = general-purpose
|paradigmi = [[Programmazione funzionale|funzionale]], [[Modularità (informatica)|modulare]]
|tipizzazione = [[Tipizzazione forte|forte]], [[Tipizzazione statica|statica]]
|estensione = .hs, .lhs
|influenzato_da =
|ha_influenzato = Agda, Bluespec, [[C++11]]/Concepts, [[
|sistema_operativo = [[Multipiattaforma]]
}}
'''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]].
== 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>
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.
Nello stesso periodo, venne formulata la [[valutazione lazy|valutazione pigra]] (lazy evaluation, call-by-need) grazie alla pubblicazione di alcuni saggi. In seguito, questo nuovo sistema di valutazione, venne
=== Haskell ===
Dalla metà degli [[Anni 1980|anni ottanta]], numerosi ricercatori richiedevano un linguaggio di programmazione puramente funzionale e basato sul concetto del call-by-need. Nel [[1987]], due dei principali fondatori del comitato per la creazione del nuovo linguaggio, Simon Peyton Jones e Paul Hudak, si incontrarono a [[Università di Yale|Yale]] per proseguire verso la conferenza
Per gettare basi solide
Il nuovo comitato venne formato a [[Università di Yale|Yale]] nel [[1988]], il suo scopo fu di formulare un linguaggio che rispettasse principalmente le seguenti caratteristiche<ref name=":0" />:
Line 36 ⟶ 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>
=== Haskell 98 ===
Dopo numerose versioni (1.1, 1.2, 1.3, 1.4) che si susseguirono tra il [[1988|1990]] ed il [[1998]], c'era il bisogno di creare una versione stabile, considerato che i numerosi problemi che affliggevano il linguaggio, come quelli relativi all [[Input/output|I/O]], erano stati superati.
Nel [[1998]] fu pubblicato ''"The Haskell 98 Report: Language and Libraries"''<ref name=":0">{{Cita web|url = https://www.haskell.org/onlinereport/|titolo = The Haskell 98 Language Report|accesso = 30 gennaio 2016
=== 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/|urlmorto = sì}}</ref>, il cui scopo è di produrre una revisione dello standard del 1998.
Nel [[2009]] è stata annunciata una nuova versione di Haskell
== Caratteristiche ==
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.
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>
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 ==
===
Il seguente esempio stampa il testo "Hello World".
<
main
</
main :: IO ()
main = do
Line 72 ⟶ 71:
</syntaxhighlight>
=== Calcolo del
Classica definizione del fattoriale con ''pattern matching:''
<
fac :: Int -> Int
fac 0 = 1
fac n = n * fac (n-1)
</
fac' n = product [1.. n]
</syntaxhighlight>
=== Calcolo della
Definizione con ''pattern matching'' per numeri naturali e applicazione di ''higher order functions'':
<
fib :: Int -> Int
fib 0 = 0
fib 1 = 1
fib n = fib (n-1) + fib (n-2)
</syntaxhighlight>
La più efficiente implementazione, tuttavia, è questa<ref>{{Cita web|url = https://wiki.haskell.org/The_Fibonacci_sequence#Fastest_Fib_in_the_West|titolo = The Fibonacci sequence - HaskellWiki|accesso = 31 gennaio 2016|sito = wiki.haskell.org}}</ref>:
<
import Data.List
import Data.Bits
Line 103 ⟶ 102:
| otherwise = (ss, g*(2*f-g))
where ss = f*f+g*g
</syntaxhighlight>
Un'altra possibile implementazione passa attraverso l'utilizzo della ricorsione in coda e l'[[applicazione parziale]] di una funzione:
=== Algoritmo di ordinamento generico [[quicksort]] ===▼
Falsa<ref>{{Cita web|url = http://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'' :▼
-- Generica successione
▲<source lang="haskell">
addSeries :: Int -> Int -> Int -> Integer
addSeries a _ 0 = a
addSeries a b n = addSeries b (a + b) (n - 1)
-- Applicazione parziale della funzione addSeries
fib :: Int -> Integer
fib = addSeries 0 1 -- sono passati solo i termini iniziali della serie
</syntaxhighlight>
▲Falsa<ref>{{Cita web|url =
<syntaxhighlight lang="haskell">
qsort :: Ord a => [a] -> [a]
qsort [] = []
Line 113 ⟶ 124:
l1 = [y | y <- xs, y<x]
l2 = [z | z <- xs, z>=x]
</syntaxhighlight>
===
<
primes = dropall [2..]
where
Line 121 ⟶ 132:
where
dropmul x l = [y | y <- l, y `mod` x /= 0]
</syntaxhighlight>
== Implementazioni ==
* '''''[[Glasgow Haskell Compiler]]''''' (
* [[Utrecht Haskell Compiler]] ('''UHC'''), sviluppato dall'[[Università di Utrecht]].
=== Implementazioni obsolete ===
Segue un elenco di implementazioni diventate ormai obsolete:
* '''''[[Hugs]]''''' (
* '''''nhc98''''' (
* '''''yhc''''' (
* '''''jhc''''' (
== Applicazioni ==
=== Industriali ===
Alcune delle principali aziende in cui viene utilizzato Haskell:<ref>{{Cita web|url = https://wiki.haskell.org/Haskell_in_industry|titolo = Haskell in industry - HaskellWiki|accesso = 25 gennaio 2016|sito = wiki.haskell.org}}</ref>
Line 146 ⟶ 156:
* [[NVIDIA]]
* [[Qualcomm|Qualcomm, Inc.]]
*[[Digital asset holding|Digital asset Holdings]]
== Librerie ==
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:
* apecs: una implementazione molto efficiente e type-driven;<ref>{{Cita web|url=https://github.com/jonascarpay/apecs|titolo=Apecs library}}</ref>
* gelatin: una collezione di funzionalità grafiche che si basa su sdl, freetype e openGL;<ref>{{Cita web|url=https://github.com/schell/gelatin|titolo=Gelatin library}}</ref>
* sdl2: package che fa da tramite con la libreria [[Simple DirectMedia Layer]].<ref>{{Cita web|url=https://hackage.haskell.org/package/sdl2|titolo=SDL2}}</ref>
== Note ==
== 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 ==
=== Concetti correlati ===
* [[Linguaggio di programmazione]]
* [[Programmazione funzionale]]
* [[Tipizzazione forte]]
Line 168 ⟶ 195:
* [[Objective Caml]]
* [[Scheme]]
*[[DAML]]
* [[Lisp]]
* [[ML (linguaggio di programmazione)]]
== Altri progetti ==
{{interprogetto
== Collegamenti esterni ==
* {{Collegamenti esterni}}
*
*
=== Tutorial ===
* {{Cita web|autore = |url = https://github.com/bitemyapp/learnhaskell/blob/master/guide-it.md|titolo = Learn Haskell|accesso = |data = }}
* {{cita web|
*
=== Libri di testo ===
* {{cita web|url=http://learnyouahaskell.com/chapters|titolo=Learn You a Haskell for Great Good!|lingua=en}}
*
=== Community ===
* {{Cita web|autore = |url = https://mail.haskell.org/pipermail/haskell-cafe/|titolo = Haskell-Cafe Archives|accesso = |data = }}
* {{Cita web|autore = |url = https://mail.haskell.org/pipermail/haskell/|titolo = Haskell Archives|accesso = |data = }}
* {{Cita web|autore = |url = https://planet.haskell.org/|titolo = Planet Haskell|accesso = |data = }}
{{Principali linguaggi di programmazione}}
|