Haskell (limbă)

De la Wikipedia, enciclopedia liberă.
Salt la navigare Salt la căutare
Haskell
limbaj de programare
Haskell-Logo.svg
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

Pictogramă lupă mgx2.svg Același subiect în detaliu: Programare funcțională .

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șă

Pictogramă lupă mgx2.svg Același subiect în detaliu: Evaluare leneșă .

Tastarea statică

Pictogramă lupă mgx2.svg Același subiect în detaliu: 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

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ă

  1. ^
    ( 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 )
  2. ^ Poate programarea să fie eliberată de stilul Von Neumann?
  3. ^ a b Raportul lingvistic Haskell 98 , la www.haskell.org . Adus la 30 ianuarie 2016 .
  4. ^ ( PDF ) Raportul limbajului de programare Haskell Un limbaj non-strict, pur funcțional, versiunea 1.0 , haskell.org , 1990.
  5. ^ Haskell Prime , pe prime.haskell.org . Adus la 31 ianuarie 2016 (arhivat din original la 20 februarie 2016) .
  6. ^ Simon Marlow, [Haskell] Announcing Haskell 2010 , la mail.haskell.org , 24 noiembrie 2009. Accesat la 30 ianuarie 2016 .
  7. ^ Secvența Fibonacci - HaskellWiki , la wiki.haskell.org . Adus la 31 ianuarie 2016 .
  8. ^ De ce minimalistul, exemplu Hasicks quicksort nu este un "adevărat" quicksort? , la stackoverflow.com . Adus la 31 ianuarie 2016 .
  9. ^ 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) .
  10. ^ Haskell în industrie - HaskellWiki , la wiki.haskell.org . Adus la 25 ianuarie 2016 .
  11. ^ Interfață aplicație web
  12. ^ warp
  13. ^ Tutoriale și exemple Scotty
  14. ^ spock
  15. ^ Yesod
  16. ^ snap-server
  17. ^ Happstack
  18. ^ Servitor
  19. ^ Biblioteca Apecs , pe github.com .
  20. ^ Biblioteca de gelatină , pe github.com .
  21. ^ 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

linkuri externe

  • Site oficial , pe haskell.org . Editați pe Wikidata
  • (EN) Hoogle , pe haskell.org.
  • (EN) Hayoo pe hayoo.fh-wedel.de (depus de „Original url 28 ianuarie 2016).

Tutorial

Manuale

Comunitate

Controlul autorității LCCN (EN) sh93003496 · GND (DE) 4318275-6 · BNF (FR) cb12362303j (dată) · BNE (ES) XX541061 (dată)
Informatică Portal IT : accesați intrările Wikipedia care se ocupă cu IT