Haskell

De la Wikipedia, enciclopedia liberă
Haskell
Haskell
Extensii fișiere.hs, .lhs
ParadigmăFunctional
Apărut în1990; acum 34 ani (1990)[1]
Proiectat deLennart Augustsson, Dave Barton, Brian Boutel, Warren Burton, Joseph Fasel, Kevin Hammond, Ralf Hinze, Paul Hudak, John Hughes, Thomas Johnsson, Mark Jones, Simon Peyton Jones, John Launchbury, Erik Meijer, John Peterson, Alastair Reid, Colin Runciman, Philip Wadler
Ultima versiuneHaskell 2010[2]  Modificați la Wikidata
TipareInferred, static, strong
Implementări majoreGHC, Hugs, NHC, JHC, Yhc, UHC
DialecteHelium, Gofer
Influențat deClean,[3] FP,[3] Gofer,[3] Hope and Hope+,[3] Id,[3] ISWIM,[3] KRC,[3] LISP,[3] Miranda,[3] ML and Standard ML,[3] Orwell, SASL,[3] Scheme,[3] SISAL[3]
InfluențeAgda,[4] Bluespec,[5] C++11/Concepts,[6] C#/LINQ,[7][8][9][10] CAL,[necesită citare] Cayenne,[7] Clean,[7] Clojure,[11] CoffeeScript,[12] Curry,[7] Elm, Epigram,[necesită citare] Escher,[13] F#,[14] Frege,[15] Hack,[16] Idris,[17] Isabelle,[7] Java/Generics,[7] LiveScript,[18] Mercury,[7] Ωmega,[necesită citare] Perl 6,[19] PureScript,[20] Python,[7][21] Rust,[22] Scala,[7][23] Swift,[24] Timber,[25] Visual Basic 9.0[7][8]
Sistem de operareCross-platform
Prezență onlinewww.haskell.org

Haskell este un limbaj de programare funcțională. Poartă numele lui Curry Haskell.

Haskell se bazează pe semantica, dar nu pe sintaxa, a limbajului de programare Miranda, care a servit la concentrarea eforturilor grupului de lucru inițial Haskell [26]. Haskell este utilizat pe scară largă în mediul academic[27][28] și în industrie[29]. Ultimul standard al lui Haskell este Haskell 2010. Începând din mai 2016, un grup, lucrează la următorul standard, Haskell 2020[30].

Istorie[modificare | modificare sursă]

După lansarea lui Miranda de către Research Software Ltd. în 1985, interesul pentru limbile funcționale leneș a crescut. Până în 1987, au existat mai mult de o duzină de limbi de programare pur strict funcționale. Miranda a fost cea mai utilizată, dar a fost software proprietar. La conferința privind limbile de programare funcțională și arhitectura informatică (FPCA '87) din Portland, Oregon, a existat un consens puternic cu privire la crearea unui comitet care să definească un standard deschis pentru astfel de limbi. Scopul comitetului a fost acela de a consolida programarea funcțională existente într-o limbă comună, care să servească drept bază pentru cercetarea viitoare în designul în limba funcțională[31].

Haskell de la 1.0 la 1.4[modificare | modificare sursă]

Prima versiune a lui Haskell ("Haskell 1.0") a fost definită în 1990[1]. Eforturile comitetului au dus la o serie de definiții lingvistice (1.0, 1.1, 1.2, 1.3, 1.4).

Haskell 98[modificare | modificare sursă]

La sfârșitul anului 1997, seria a culminat cu Haskell 98, menită să specifice o versiune stabilă, minimală și portabilă a limbii și o bibliotecă standard de însoțire pentru predare și ca bază pentru viitoarele extensii. Comitetul a salutat în mod expres crearea de extensii și variante ale lui Haskell 98 prin adăugarea și încorporarea caracteristicilor experimentale[31].

În februarie 1999, standardul de limbă Haskell 98 a fost inițial publicat ca Raportul Haskell 98[31]. În ianuarie 2003, o versiune revizuită a fost publicată ca Haskell 98 Language and Libraries: Raportul revizuit[32]. Limba continuă să evolueze rapid, implementarea Glasgow Haskell Compiler (GHC) reprezentând standardul de facto actual[33].

Haskell 2010[modificare | modificare sursă]

La începutul anului 2006, a început procesul de definire a unui succesor al standardului Haskell 98, denumit informal Haskell Prime[34]. Acest obiectiv a fost intenționat a fi un proces incremental continuu de revizuire a definiției limbajului, generând o nouă revizie o dată pe an. Prima revizuire, numită Haskell 2010, a fost anunțată în noiembrie 2009[35] și publicată în iulie 2010.

Haskell 2010 este o actualizare incrementală a limbii, care cuprinde mai multe caracteristici bine utilizate și necontroversate activate anterior prin intermediul unor steaguri specifice compilatorului.

Caracteristici ale limbajului funcțional Haskell[modificare | modificare sursă]

Haskell prezintă o evaluare leneșă a expresiilor, adică "apel prin nevoi"

Spre deosebire de limbajele imperative care manipulează practic date sub formă de numere întregi sau valori codate prin numere întregi (caractere, stringuri, pointeri), limbajele funcționale manipulează funcții codate prin "expresii lambda". Dacă limbajul funcțional e compilat sunt codate prin combinatori. Cum mulțimea functiilor este mai bogată decât cea a numerelor întregi (are un cardinal mai mare), asemenea limbaje sunt mult mai expresive.

La nivel pragmatic, orice limbaj functional poate fi văzut ca un manipulator de algoritmi, exprimați cel mai adesea ca la orele de matematică elementară.

Teoria matematică a calculului lambda se studiază în cadrul cursului de Programare funcțională.

Haskell acceptă atât tipurile de sume, cât și tipurile de produse

Alte informații despre limbajul Haskell[modificare | modificare sursă]

  • în Haskell puteți scrie programe sigure, funcțiile din limbajul funcțional nefiind afectate de efecte externe, cum ar fi schimbări de variabile globale.
  • în Haskell puteți manipula algoritmi sub formă de funcții. Se deschide astfel ușa către o serie de domenii incluzând printre ele "Algoritmii genetici" unele optimizari, "Șabloane de programare", "Inteligența artificială", "Sisteme adaptive" și alte domenii
  • putem modela procese, care se combină între ele, deoarece avem la dispoziție compunerea de funcții.
  • putem face verificări ale datelor folosind parsere modulare ale căror efecte / verificări asupra intrărilor se compun
  • putem scrie algoritmi generici urmând ca funcția/prelucrarea care lipsește să fie furnizată ca parametru ulterior
  • putem demonstra matematic corectitudinea funcțiilor scrise, dacă se cere așa ceva
  • avem la dispoziție funcții anonime, funcții de unică întrebuințare.
  • deoarece aplicarea funcțiilor asociază la dreapta iar în cursul calculelor regulile de reducere se pot aplica în mai multe locuri din formulă, evaluarea unei formule se poate face pe mai multe procesoare conlucrând! Acest lucru califică limbajele funcționale (bazate pe combinatori și/sau lambda calcul) printre limbajele din deceniul procesării dual-core și/sau quad-core.
  • în Haskell, limbaj funcțional pur, fără efecte laterale, funcțiile dau întotdeauna același rezultat (da, chiar și funcțiile pentru I/O - vedeți monada de I/O) ceea ce permite garantarea calității software-ului. Permite de asemenea și demonstrarea calității lui.
  • puteți încapsula șabloane de programare în funcții de ordin superior
  • puteți lucra în stiluri cum sunt generic programming și monadic programming (cel puțin în Haskell și ceva mai greu în alte limbaje funcționale cum sunt LISP și Scheme)
  • daca limbajul admite clase (Haskell admite, iar Lisp-ul nu) puteți defini clase în care datele manipulate sunt de fapt funcții.
  • în Haskell, limbaj funcțional pur, 'acțiunile de I/O' se pot folosi și ca instrucțiuni, și ca date. Pot fi plasate pe liste, pe arbori sau pe alte structuri, puteti parcurge cum doriți lista sau arborele și construi dinamic, din mers, o acțiune de I/O compusă. Această acțiune numită main este executată când rulați programul.

Exemple de coduri[modificare | modificare sursă]

Un Program Hello, world! în Haskell (doar ultima linie este strict necesară):

module Main (main) where          -- not needed in interpreter, is the default in a module file

main :: IO ()                       -- the compiler can infer this type definition
main = putStrLn "Hello, World!"

Funcția factorială în Haskell, definită în câteva moduri diferite:

-- Type annotation (optional, same for each implementation)
factorial :: (Integral a) => a -> a

-- Using recursion (with the "ifthenelse" expression)
factorial n = if n < 2
              then 1
              else n * factorial (n - 1)

-- Using recursion (with pattern matching)
factorial 0 = 1
factorial n = n * factorial (n - 1)

-- Using recursion (with guards)
factorial n
   | n < 2     = 1
   | otherwise = n * factorial (n - 1)

-- Using a list and the "product" function
factorial n = product [1..n]

-- Using fold (implements "product")
factorial n = foldl (*) 1 [1..n]

-- Point-free style
factorial = foldr (*) 1 . enumFromTo 1

Deoarece tipul Integer are o precizie arbitrară, acest cod va calcula valori cum ar fi factorial 100000 (un număr de 456,574 de cifre), fără pierderi de precizie.

O implementare a unui algoritm similar listei de quicksort, unde primul element este luat ca pivot:

-- Type annotation (optional, same for each implementation)
quickSort :: Ord a => [a] -> [a]

-- Using list comprehensions
quickSort []     = []                               -- The empty list is already sorted
quickSort (x:xs) = quickSort [a | a <- xs, a < x]   -- Sort the left part of the list
                   ++ [x] ++                        -- Insert pivot between two sorted parts
                   quickSort [a | a <- xs, a >= x]  -- Sort the right part of the list

-- Using filter
quickSort []     = []
quickSort (x:xs) = quickSort (filter (<x) xs)
                   ++ [x] ++
                   quickSort (filter (>=x) xs)

Sigla Haskell din partea de sus a acestei pagini a fost generată de codul Haskell[36].

Note[modificare | modificare sursă]

  1. ^ a b Hudak et al. 2007.
  2. ^ [Haskell] Announcing Haskell 2010 (în engleză), , accesat în  
  3. ^ a b c d e f g h i j k l m Peyton Jones 2003, p. xi.
  4. ^ Norell, Ulf (). „Dependently Typed Programming in Agda” (PDF). Gothenburg: Chalmers University. Accesat în . 
  5. ^ Hudak et al. 2007, p. 12-38,43.
  6. ^ Stroustrup, Bjarne; Sutton, Andrew (). „Design of Concept Libraries for C++” (PDF). Arhivat din original (PDF) la . 
  7. ^ a b c d e f g h i j Hudak et al. 2007, pp. 12-45–46.
  8. ^ a b Meijer, Erik (). „Confessions of a Used Programming Language Salesman: Getting the Masses Hooked on Haskell”. Oopsla 2007. CiteSeerX 10.1.1.72.868Accesibil gratuit. 
  9. ^ Meijer, Erik (). „C9 Lectures: Dr. Erik Meijer – Functional Programming Fundamentals, Chapter 1 of 13”. Channel 9. Microsoft. Arhivat din original la . Accesat în . 
  10. ^ Drobi, Sadek (). „Erik Meijer on LINQ”. InfoQ. QCon SF 2008: C4Media Inc. Accesat în . 
  11. ^ Hickey, Rich. „Clojure Bookshelf”. Listmania!. Arhivat din original la . Accesat în . 
  12. ^ Heller, Martin (). „Turn up your nose at Dart and smell the CoffeeScript”. JavaWorld. InfoWorld. Arhivat din original la . Accesat în . 
  13. ^ „Declarative programming in Escher” (PDF). Accesat în . 
  14. ^ Syme, Don; Granicz, Adam; Cisternino, Antonio (). Expert F#. Apress. p. 2. F# also draws from Haskell particularly with regard to two advanced language features called sequence expressions and workflows. 
  15. ^ Wechsung, Ingo. „The Frege Programming Language” (PDF). Accesat în . 
  16. ^ „Facebook Introduces 'Hack,' the Programming Language of the Future”. WIRED. . 
  17. ^ „Idris, a dependently typed language”. Accesat în . 
  18. ^ „LiveScript Inspiration”. Accesat în . 
  19. ^ „Glossary of Terms and Jargon”. Perl Foundation Perl 6 Wiki. The Perl Foundation. Arhivat din original la . Accesat în . 
  20. ^ Freeman, Phil (). „PureScript by Example”. Leanpub. Accesat în . 
  21. ^ Kuchling, A. M. „Functional Programming HOWTO”. Python v2.7.2 documentation. Python Software Foundation. Accesat în . 
  22. ^ „The Rust Reference: Appendix: Influences”. Accesat în . 
  23. ^ Fogus, Michael (). „MartinOdersky take(5) toList”. Send More Paramedics. Accesat în . 
  24. ^ Lattner, Chris (). „Chris Lattner's Homepage”. Chris Lattner. Accesat în . The Swift language is the product of tireless effort from a team of language experts, documentation gurus, compiler optimization ninjas, and an incredibly important internal dogfooding group who provided feedback to help refine and battle-test ideas. Of course, it also greatly benefited from the experiences hard-won by many other languages in the field, drawing ideas from Objective-C, Rust, Haskell, Ruby, Python, C#, CLU, and far too many others to list. 
  25. ^ „Timber/History”. Arhivat din original la . Accesat în . 
  26. ^ Edward Kmett, Edward Kmett - Type Classes vs. the World
  27. ^ „Haskell in education”. Accesat în . 
  28. ^ „Haskell in research”. Accesat în . 
  29. ^ „Haskell in industry”. Accesat în . 
  30. ^ Riedel, Herbert Valerio (Thu Apr 28 09:57:54 UTC 2016), https://mail.haskell.org/pipermail/haskell-prime/2016-April/004050.html  Verificați datele pentru: |date= (ajutor); Lipsește sau este vid: |title= (ajutor)
  31. ^ a b c Peyton Jones 2003, Preface.
  32. ^ Peyton Jones 2003.
  33. ^ „Haskell Wiki: Implementations”. Accesat în . 
  34. ^ „Welcome to Haskell'. The Haskell' Wiki. 
  35. ^ Marlow, Simon (). „Announcing Haskell 2010”. Haskell (Mailing list). Accesat în . 
  36. ^ Haskell.org, Thompson-Wheeler logo in Haskell. (2010) The public domain Haskell script which generates .svg of this logo. The logo is a monad bind (>>=) overlaid by a lambda (λ).

Vezi și[modificare | modificare sursă]

Legături externe[modificare | modificare sursă]