Haskell (limbă)
Haskell limbaj de programare | |
---|---|
Autor | 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 de origine | 1990 |
Ultima versiune | Haskell 2010 (iulie 2010) |
Utilizare | {{{utilizare}}} |
Paradigme | funcțional , modular |
Tastare | puternic , static |
Extensii comune | .hs, .lhs |
Influențată de | Clean, FP, Gofer, Hope and Hope +, Id, ISWIM, KRC, Lisp , Miranda, ML și Standard ML, Orwell, SASL, SISAL, Scheme |
A influențat | 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 |
Implementare referință | |
Sistem de operare | Multiplatform |
Site-ul web | Limbajul Haskell |
Haskell este un limbaj de programare de uz general pur funcțional creat de un comitet special la sfârșitul anilor optzeci, în principal pentru a analiza caracteristicile limbajelor [1] . A fost numit în onoarea matematicianului și logicianului american Haskell Curry .
Istorie
Începutul programării funcționale
Totul a început în 1978 cu discursul lui John Backus intitulat „Programarea poate fi eliberată de stilul Von Neumann?” [2] cu care programarea funcțională a fost propusă nu numai ca o simplă curiozitate matematică, ci și în scopuri industriale.
Între anii șaptezeci și optzeci ai secolului al XX-lea , au fost implementate mai multe limbaje funcționale, deși încă strâns legate de limbaje imperative, care s-au bazat mai mult pe conceptul de calcul al calculului lambda . Exemplele includ Scheme și diferitele dialecte ML din această perioadă.
În aceeași perioadă, a fost formulată evaluarea leneșă ( evaluarea leneșă, apel la nevoie) cu publicarea mai multor eseuri. Ulterior, acest nou sistem de evaluare a fost implementat în LazyML , Clean , Daisy , Orwell .
Haskell
De la mijlocul anilor 1980 , mulți cercetători au cerut un limbaj de programare pur funcțional bazat pe conceptul de apel la nevoie. În 1987 , doi dintre principalii fondatori ai noului comitet de creare a limbajului, Simon Peyton Jones și Paul Hudak, s-au întâlnit la Yale pentru a trece la Conferința de programare și arhitectură funcțională (FPAC) .
Pentru a pune bazele solide pentru un nou limbaj standardizat, cercetătorii adunați la FPAC, decid să pornească de la cel dezvoltat de David Turner, Miranda , care era deja pur funcțional și avea o implementare robustă. Dar Turner, văzând că limba a avut deja o bună difuzie, a refuzat să o separe în diferite dialecte. În ciuda acestui fapt, Miranda va rămâne principala influență a lui Haskell.
Noul comitet a fost format la Yale în 1988 , scopul său a fost de a formula un limbaj care să respecte în principal următoarele caracteristici [3] :
- Potrivit pentru predare, cercetare, aplicații și construirea de sisteme mari;
- Descris pe deplin prin publicarea unei sintaxi formale și a semanticii;
- Gratuit disponibil;
- Bazat pe idei de consens larg;
- Reduceți diversitatea în limbi funcționale.
După doi ani, adică la 1 aprilie 1990 , a fost publicată prima versiune a limbii care se va numi Haskell 1.0 în cinstea lui Haskell Curry , iar începutul publicației începe cu un citat al celebrului matematician american [4] .
98
După numeroase versiuni (1.1, 1.2, 1.3, 1.4) care s-au succedat între 1990 și 1998 , a fost nevoie să se creeze o versiune stabilă, dat fiind faptul că numeroasele probleme care au afectat limba, cum ar fi cele legate de I / O , fusese depășită.
În 1998 a fost publicat „Raportul Haskell 98: Limbă și biblioteci” [3] , care conține descrierea standardului și a unor biblioteci, care vor fi revizuite în continuare de Simon Peyton Jones și republicate în 2002 .
Haskell 2010
În 2006 , a fost creat comitetul Haskell Prime ( Haskell ' ) [5] , al cărui scop este să producă o revizuire a standardului din 1998.
În 2009 a fost anunțată o nouă versiune a Haskell numită Haskell 2010 [6] . Principalele modificări au fost eliminarea modelului n + k și implementarea a numeroase expresii simplificate sau numite și zahăr sintactic , cum ar fi notația do , gardienii , expresia dacă atunci altfel .
Caracteristici
Evaluare leneșă
Tastarea statică
Pur funcțional
Cod simplu
Salut Lume!
Următorul exemplu imprimă textul „Hello World”.
principal = face
putStrLn "Hello World!"
O versiune puțin mai interactivă :
principal :: IO ()
principal = face
putStr "Introduceți-vă numele:"
nume <- getLine
putStrLn $ "Hello" ++ nume
Calculul factorialului
Definiția clasică a factorialului cu potrivirea modelului:
fac :: Int -> Int
fac 0 = 1
fac n = n * fac ( n - 1 )
O altă definiție mai restrânsă, folosind funcția produsului :
fac ' n = produs [ 1 .. n ]
Calculul secvenței Fibonacci
Definiție cu potrivirea modelelor pentru numerele naturale și aplicarea funcțiilor de ordin superior :
fib :: Int -> Int
fib 0 = 0
fib 1 = 1
fib n = fib ( n - 1 ) + fib ( n - 2 )
Cu toate acestea, cea mai eficientă implementare este aceasta [7] :
import Data.List
import Data.Bits
fib :: Int -> Număr întreg
fib n = snd . foldl ' fib' ( 1 , 0 ) . drop În timp ce nu $
[ testBit n k | k <- let s = finiteBitSize n în [ s - 1 , s - 2 .. 0 ]]
Unde
fib ' ( f , g ) p
| p = ( f * ( f + 2 * g ), ss )
| altfel = ( ss , g * ( 2 * f - g ))
unde ss = f * f + g * g
O altă posibilă implementare trece prin utilizarea recursivității cozii și aplicarea parțială a unei funcții:
- Succesiunea generică
addSeries :: Int -> Int -> Int -> Număr întreg
addSeries a _ 0 = a
addSeries a b n = addSeries b ( a + b ) ( n - 1 )
- Aplicarea parțială a funcției addSeries
fib :: Int -> Număr întreg
fib = addSeries 0 1 - sunt trecuți doar termenii inițiali ai seriei
Algoritm de sortare generic Quicksort
Implementare polimorfă falsă [8] cu potrivirea modelelor și înțelegerea listei :
qsort :: Ord a => [ a ] -> [ a ]
qsort [] = []
qsort ( x : xs ) = qsort l1 ++ [ x ] ++ qsort l2
Unde
l1 = [ y | y <- xs , y < x ]
l2 = [ z | z <- xs , z > = x ]
Seta lui Eratostene
prime = dropall [ 2 .. ]
Unde
dropall ( x : xs ) = x : dropall ( dropmul x xs )
Unde
dropmul x l = [ y | y <- l, y mod " x / = 0]
Implementări
- Glasgow Haskell Compiler ( The Glasgow Haskell Compiler ), sau GHC , este cel mai popular compilator Haskell până în prezent, datorită numeroaselor plugin-uri și eficiență care îi permite să fie comparat direct cu C ++ , în unele cazuri [9] .
- Utrecht Haskell Compiler ( UHC ), dezvoltat de Universitatea din Utrecht .
Implementări învechite
Mai jos este o listă de implementări care au devenit învechite:
- Hugs ( Hugs 98 ), sau sistemul Gofer al utilizatorului Haskell , este un interpret portabil de bytecode pentru numeroase platforme. Mulțumită și interfeței grafice și modului interactiv, este un mod excelent de a învăța limba Haskell. De la crearea GHCi, interpretul interactiv al GHC, acesta nu mai este utilizat.
- nhc98 ( nhc98 ), compilator bytecode potrivit în special pentru mașinile mai vechi datorită utilizării reduse a memoriei.
- yhc ( Neil Mitchell - Yhc Arhivat 3 februarie 2006 la Internet Archive .), sau York Haskell Compiler , este un furculiță de nhc98 care vizează creșterea performanței și portabilității sale.
- jhc ( jhc ) este un compilator menit să producă cod optimizat cât mai mult posibil, dar în prezent trebuie considerat experimental.
Aplicații
Industrial
Unele dintre principalele companii în care este utilizat Haskell: [10]
Biblioteci
Printre bibliotecile pentru dezvoltarea pe partea de server găsim:
- wai: Haskell Web Application Interface, un set de interfețe pentru dezvoltarea aplicațiilor web; [11]
- warp: un server web rapid și ușor pentru aplicații care implementează interfețe wai; [12]
- scotty: un cadru web inspirat de Sinatra, menit să fie simplu; [13]
- spock: mai ușor decât așa-numitele cadre de întreprindere, dar cu mai multe funcționalități decât scotty; [14]
- yesod: un cadru de întreprindere pentru dezvoltarea aplicațiilor web; [15]
- snap - un alt cadru de întreprindere; [16]
- happstack-server: un alt cadru de întreprindere; [17]
- server: o bibliotecă care utilizează tipuri pentru a defini interfețele REST. [18]
Biblioteci grafice și dezvoltare de jocuri:
- apecs: o implementare foarte eficientă și bazată pe tip; [19]
- gelatină: o colecție de caracteristici grafice bazate pe sdl, freetype și openGL; [20]
- sdl2: pachet care acționează ca o legătură cu biblioteca simplă DirectMedia Layer . [21]
Notă
- ^
( RO ) „Ne-am dorit un limbaj care să poată fi folosit, printre alte scopuri, pentru cercetarea caracteristicilor lingvistice;”
( IT ) „Am vrut un limbaj care să poată fi folosit, pe lângă alte scopuri, pentru a studia caracteristicile limbajului;”
( A History of Haskell: Being Lazy With Class, Simon Peyton Jones, Paul Hudak, John Hughes, Philip Wadler ) - ^ Poate programarea să fie eliberată de stilul Von Neumann?
- ^ a b Raportul lingvistic Haskell 98 , la www.haskell.org . Adus la 30 ianuarie 2016 .
- ^ ( PDF ) Raportul limbajului de programare Haskell Un limbaj non-strict, pur funcțional, versiunea 1.0 , haskell.org , 1990.
- ^ Haskell Prime , pe prime.haskell.org . Adus la 31 ianuarie 2016 (arhivat din original la 20 februarie 2016) .
- ^ Simon Marlow, [Haskell] Announcing Haskell 2010 , la mail.haskell.org , 24 noiembrie 2009. Accesat la 30 ianuarie 2016 .
- ^ Secvența Fibonacci - HaskellWiki , la wiki.haskell.org . Adus la 31 ianuarie 2016 .
- ^ De ce minimalistul, exemplu Hasicks quicksort nu este un "adevărat" quicksort? , la stackoverflow.com . Adus la 31 ianuarie 2016 .
- ^ Haskell GHC vs C ++ g ++ (64-bit Ubuntu quad core) | Joc de referință pentru limbajul computerului , la benchmarksgame.alioth.debian.org . Adus la 30 ianuarie 2016 (arhivat din original la 16 aprilie 2016) .
- ^ Haskell în industrie - HaskellWiki , la wiki.haskell.org . Adus la 25 ianuarie 2016 .
- ^ Interfață aplicație web
- ^ warp
- ^ Tutoriale și exemple Scotty
- ^ spock
- ^ Yesod
- ^ snap-server
- ^ Happstack
- ^ Servitor
- ^ Biblioteca Apecs , pe github.com .
- ^ Biblioteca de gelatină , pe github.com .
- ^ SDL2 , la hackage.haskell.org .
Bibliografie
- Paul Hudak, John Hughes, Simon Peyton Jones, Philip Wadler, A history of Haskell: Being Lazy With Class , San Diego, CA, 2007.
- Graham Hutton, Programare în Haskell , Cambridge University Press, 2007, pp. 170 , ISBN 978-0-521-87172-3 .
Elemente conexe
Concepte conexe
Limbi conexe
Alte proiecte
- Wikimedia Commons conține imagini sau alte fișiere despre Haskell
linkuri externe
- Site oficial , pe haskell.org .
- (EN) Hoogle , pe haskell.org.
- (EN) Hayoo pe hayoo.fh-wedel.de (depus de „Original url 28 ianuarie 2016).
Tutorial
- Aflați Haskell , pe github.com .
- ( EN ) Wiki-ul Haskell , pe haskell.org .
- ( EN ) School of Haskell , pe schoolofhaskell.com .
Manuale
- (EN) Learn You a Haskell for Great Good! , la learnyouahaskell.com .
- ( EN ) Bryan O'Sullivan, Don Stewart, John Goerzen, Real World Haskell , la book.realworldhaskell.org , O'Reilly Media, 2008.
Comunitate
- Arhivele Haskell-Cafe , la mail.haskell.org .
- Arhive Haskell , la mail.haskell.org .
- Planeta Haskell , la planet.haskell.org .
Controlul autorității | LCCN (EN) sh93003496 · GND (DE) 4318275-6 · BNF (FR) cb12362303j (dată) · BNE (ES) XX541061 (dată) |
---|