Sari la conținut

Haskell

De la Wikipedia, enciclopedia liberă
Haskell
Haskell
Extensiifiș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]Hopeand Hope+,[3]Id,[3]ISWIM,[3]KRC,[3]LISP,[3]Miranda,[3]MLandStandard 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

Haskelleste unlimbaj de programarefuncțională.Poartă numele luiCurry 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].

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 fostsoftware proprietar.La conferința privind limbile de programare funcțională și arhitectura informatică (FPCA '87) dinPortland, Oregon,a existat un consens puternic cu privire la crearea unui comitet care să definească unstandard deschispentru astfel de limbi. Scopul comitetului a fost acela de a consolidaprogramarea 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).

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 caRaportul Haskell 98[31].În ianuarie 2003, o versiune revizuită a fost publicată caHaskell 98 Language and Libraries:Raportul revizuit[32].Limba continuă să evolueze rapid, implementarea Glasgow Haskell Compiler (GHC) reprezentând standardul de facto actual[33].

La începutul anului 2006, a început procesul de definire a unui succesor al standardului Haskell 98, denumit informalHaskell 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ă practicdatesub 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 uncardinalmai 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 deProgramare 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 parseremodulareale căror efecte / verificări asupra intrărilor se compun
  • putem scrie algoritmigenericiurmâ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țiide 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 suntgeneric programmingșimonadic 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ămaineste executată când rulați programul.

Exemple de coduri

[modificare|modificare sursă]

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

moduleMain(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țiafactorialăîn Haskell, definită în câteva moduri diferite:

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

-- Using recursion (with the "ifthenelse" expression)
factorialn=ifn<2
then1
elsen*factorial(n-1)

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

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

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

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

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

Deoarece tipulIntegerare o precizie arbitrară, acest cod va calcula valori cum ar fifactorial 100000(un număr de 456,574 de cifre), fără pierderi de precizie.

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

-- Type annotation (optional, same for each implementation)
quickSort::Orda=>[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].

  1. ^abHudak et al. 2007.
  2. ^[Haskell] Announcing Haskell 2010(în engleză),,accesat în
  3. ^abcdefghijklmPeyton 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 dinoriginal(PDF)la.
  7. ^abcdefghijHudak et al. 2007,pp. 12-45–46.
  8. ^abMeijer, Erik(). „Confessions of a Used Programming Language Salesman: Getting the Masses Hooked on Haskell”.Oopsla 2007.CiteSeerX10.1.1.72.868Accesibil gratuit.
  9. ^Meijer, Erik ().„C9 Lectures: Dr. Erik Meijer – Functional Programming Fundamentals, Chapter 1 of 13”.Channel 9.Microsoft. Arhivat dinoriginalla.Accesat în.
  10. ^Drobi, Sadek ().„Erik Meijer on LINQ”.InfoQ.QConSF2008: C4Media Inc.Accesat în.
  11. ^Hickey, Rich.„Clojure Bookshelf”.Listmania!.Arhivat dinoriginalla.Accesat în.
  12. ^Heller, Martin ().„Turn up your nose at Dart and smell the CoffeeScript”.JavaWorld.InfoWorld. Arhivat dinoriginalla.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 calledsequence expressionsandworkflows.
  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 dinoriginalla.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 dinoriginalla.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.htmlVerificați datele pentru:|date=(ajutor);Lipsește sau este vid:|title=(ajutor)
  31. ^abcPeyton 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 monadbind(>>=) overlaid by a lambda (λ).

Legături externe

[modificare|modificare sursă]