Loading AI tools
linguaggio di programmazione Da Wikipedia, l'enciclopedia libera
Haskell è un linguaggio di programmazione puramente funzionale general-purpose creato da un apposito comitato alla fine degli anni ottanta principalmente per analizzare le caratteristiche dei linguaggi[1]. È stato chiamato così in onore del matematico e logico statunitense Haskell Curry.
Haskell linguaggio di programmazione | |
---|---|
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 di origine | 1990 |
Ultima versione | Haskell 2010 (luglio 2010) |
Utilizzo | general-purpose |
Paradigmi | funzionale, modulare |
Tipizzazione | forte, statica |
Estensioni comuni | .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#/LINQ, CAL, Cayenne, Clean, Clojure, CoffeeScript, Curry, D, Elm, Epigram, Escher, F#, Isabelle, Java/Generics, Kaya, Mercury, Omega, Perl 6, Python, Qi, Scala, Timber, Visual Basic 9.0, Rust |
Implementazione di riferimento | |
Sistema operativo | Multipiattaforma |
Sito web | Haskell Language |
Tutto iniziò nel 1978 con il discorso di John Backus intitolato "Can Programming be liberated from the Von Neumann style?"[2] con il quale si proponeva la programmazione funzionale non solo come una mera curiosità matematica, bensì anche per scopi industriali.
Tra gli anni settanta ed 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 di questo periodo.
Nello stesso periodo, venne formulata la valutazione pigra (lazy evaluation, call-by-need) grazie alla pubblicazione di alcuni saggi. In seguito, questo nuovo sistema di valutazione, venne implementato in LazyML, Clean, Daisy, Orwell.
Dalla metà degli 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 Yale per proseguire verso la conferenza Functional Programming and Architecture Conference (FPAC).
Per gettare basi solide di un nuovo linguaggio standardizzato, i ricercatori riuniti al FPAC, decisero di partire da quello sviluppato da David Turner, Miranda che era già puramente funzionale e aveva una robusta implementazione. Ma Turner, visto che il linguaggio aveva già avuto una discreta diffusione, si rifiutò di separarlo in diversi dialetti. Malgrado questo fatto, Miranda, rimarrà la principale influenza di Haskell.
Il nuovo comitato venne formato a Yale nel 1988, il suo scopo fu di formulare un linguaggio che rispettasse principalmente le seguenti caratteristiche[3]:
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[4].
Dopo numerose versioni (1.1, 1.2, 1.3, 1.4) che si susseguirono tra il 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 I/O, erano stati superati.
Nel 1998 fu pubblicato "The Haskell 98 Report: Language and Libraries"[3], che contiene la descrizione dello standard e di alcune librerie, il quale verrà ulteriormente revisionato da Simon Peyton Jones e ripubblicato nel 2002.
Nel 2006 fu creato il comitato Haskell Prime (Haskell')[5], il cui scopo è di produrre una revisione dello standard del 1998.
Nel 2009 è stata annunciata una nuova versione di Haskell chiamata Haskell 2010[6]. 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.
Il seguente esempio stampa il testo "Hello World".
main = do
putStrLn "Hello World!"
Una versione un po' più interattiva:
main :: IO ()
main = do
putStr "Scrivi il tuo nome:"
nome <- getLine
putStrLn $ "Ciao " ++ nome
Classica definizione del fattoriale con pattern matching:
fac :: Int -> Int
fac 0 = 1
fac n = n * fac (n-1)
Un'altra definizione più ristretta, utilizzando la funzione product:
fac' n = product [1.. n]
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)
La più efficiente implementazione, tuttavia, è questa[7]:
import Data.List
import Data.Bits
fib :: Int -> Integer
fib n = snd . foldl' fib' (1, 0) . dropWhile not $
[testBit n k | k <- let s = finiteBitSize n in [s-1,s-2..0]]
where
fib' (f, g) p
| p = (f*(f+2*g), ss)
| otherwise = (ss, g*(2*f-g))
where ss = f*f+g*g
Un'altra possibile implementazione passa attraverso l'utilizzo della ricorsione in coda e l'applicazione parziale di una funzione:
-- Generica successione
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
Falsa[8] implementazione polimorfa con pattern matching e list comprehension :
qsort :: Ord a => [a] -> [a]
qsort [] = []
qsort (x:xs) = qsort l1 ++ [x] ++ qsort l2
where
l1 = [y | y <- xs, y<x]
l2 = [z | z <- xs, z>=x]
primes = dropall [2..]
where
dropall (x:xs) = x:dropall(dropmul x xs)
where
dropmul x l = [y | y <- l, y `mod` x /= 0]
Segue un elenco di implementazioni diventate ormai obsolete:
Alcune delle principali aziende in cui viene utilizzato Haskell:[10]
Tra le librerie per lo sviluppo lato server troviamo:
Librerie grafiche e lo sviluppo di videogiochi:
Seamless Wikipedia browsing. On steroids.
Every time you click a link to Wikipedia, Wiktionary or Wikiquote in your browser's search results, it will show the modern Wikiwand interface.
Wikiwand extension is a five stars, simple, with minimum permission required to keep your browsing private, safe and transparent.