Haskell
| Haskell | ||
|---|---|---|
|
| ||
|
Paul Hudak , Lennart Augustsson, John Hughes, Simon Peyton Jones , Erik Meijer și Philip Wadler https://www.haskell.org | ||
| Informatii generale | ||
| Extensii comune | hs și lhs | |
| Paradigmă | Funcțional , non-strict, modular, puternic tipizat | |
| Aparut in | 1990 | |
| Proiectat de | Universitatea Yale , Universitatea din Glasgow | |
| tip sistem | puternic, static | |
| implementari | GHC , Hugs , NHC, Yhc, JHC | |
| influențată de | Miranda, Orwell, M.L., Gofer | |
| a influențat | Python , Java , C# , Scala | |
Haskell (pronunțat / hæskəl /) [ 1 ] este un limbaj de programare standardizat, polivalent, pur funcțional , cu evaluare liberă și memorată și tastare statică puternică. Numele său se datorează logicianului american Haskell Curry , datorită contribuției sale la calculul lambda , care are o mare influență asupra limbii. În Haskell, „o funcție este un cetățean de primă clasă” al limbajului de programare. Ca limbaj de programare funcțional, constructorul principal de control este funcția. Limba își are originile din observațiile lui Haskell Curry și descendenții săi intelectuali.
În anii 1980 , a fost înființat un comitet al cărui obiectiv era să creeze un limbaj funcțional care să reunească caracteristicile multiplelor limbi funcționale ale vremii, în special Miranda , și să rezolve confuzia creată de proliferarea lor.
Limbajul evoluează rapid și (vezi mai jos) ca reprezentanți actuali ai standardului de facto . Cel mai recent standard oficial este: Haskell 2010 , ale cărui diferențe față de standardul precedent Haskell 98 sunt:
Caracteristici noi ale limbii:
- Foreign Function Interface (FFI), care vă permite să utilizați codul C într-un program Haskell și codul Haskell într-un program C. Un exemplu explicativ poate fi găsit aici
- Nume ierarhice pentru module, de exemplu Data.Bool.
- Gardieni cu tipare.
Caracteristici ale limbii eliminate:
- Sintaxa modelului (n+k). Deci următoarea definiție a funcției factoriale nu este valabilă în Haskell 2010 și mai târziu:
fact (n+1) = (n+1) * fact n.
Cele mai interesante caracteristici ale Haskell includ suport pentru tipuri și funcții recursive de date , liste, tuple , garduri și potrivire de modele . Combinația dintre ele poate duce la unele funcții aproape banale a căror versiune în limbaje imperative poate fi extrem de obositoare de programat. Haskell este, din 2002, unul dintre cele mai cercetate limbaje funcționale . Au fost dezvoltate multe variante:
- Versiuni paralele de la MIT și Glasgow , ambele numite Parallel Haskell .
- Mai multe versiuni paralele și distribuite ale lui Haskell numite Distributed Haskell (fostă Goffin ) și Eden.
- O versiune cu execuție speculativă: Eager Haskell .
- Diverse versiuni orientate pe obiecte : Haskell++ , O'Haskell și Mondrian .
- O versiune educațională numită Gofer dezvoltată de Mark Jones, care a fost înlocuită de Hugs (vezi mai jos).
Pentru informații mai detaliate, consultați site-ul oficial sau link-urile de la sfârșitul acestui articol.
Istoric
Începând cu publicarea Miranda în 1985 , limbajele funcționale au proliferat. În 1987, existau mai mult de o duzină de limbaje de programare pur și funcționale non-strict concurând între ele. În cadrul conferinței privind limbaje de programare funcționale și arhitecturi de computer (FPCA '87) din Portland , Oregon , a avut loc o întâlnire în cadrul căreia s-a ajuns la un consens puternic între participanții săi pentru a forma un comitet care să definească un standard deschis pentru astfel de limbaje. Acest lucru a fost făcut cu scopul expres de a consolida limbile existente într-una singură, care să servească drept bază pentru cercetările viitoare în proiectarea limbajului. [ 2 ] Prima versiune a lui Haskell ("Haskell 1.0") a fost definită în 1990 . [ 3 ] Eforturile comitetului au dus la o serie de definiții ale limbii, care au culminat la sfârșitul anului 1997 în Haskell 98 , care trebuia să fie o versiune minimă, stabilă și portabilă a limbii, împreună cu o bibliotecă standard asociată pentru predare și ca o bază pentru extinderi viitoare. Comitetul a aprobat în mod expres crearea de extensii și variante de Haskell 98 prin adăugarea și încorporarea caracteristicilor experimentale.
În ianuarie 1999 , standardul lingvistic Haskell 98 a fost publicat în „The Haskell 98 Report”. În ianuarie 2003 , o versiune revizuită a fost publicată în „Haskell 98 Language and Libraries: The Revised Report”. [ 4 ] Limbajul continuă să evolueze rapid, implementările Hugs și GHC (vezi mai jos) reprezentând standardul actual de facto . La începutul anului 2006, a început procesul de definire a unui succesor al standardului Haskell 98, numit informal Haskell′ („Haskell Prime”). [ 5 ] Acest proces încearcă să producă o revizuire minoră a Haskell 98. [ 6 ] În 2010 , Haskell 2010 este lansat .
Tipuri simple predefinite
În Haskell și în cele ce urmează, „o :: t” înseamnă că expresia „o” este de tip „t”, iar „t -> s” este un tip, în special o funcție, care consumă ceva de tip „t " și produce ceva de tipul "s". Operatorul (->) se asociază la dreapta, deoarece „t -> s -> r” înseamnă „t -> (s -> r)”.
Tipul Bool
Valorile cu acest tip reprezintă expresii logice al căror rezultat poate fi Adevărat sau Fals .
Funcții și operatori
(&&) :: Bool -> Bool -> Bool. conjuncție logică.(||) :: Bool -> Bool -> Bool. disjuncție logică.not :: Bool -> Bool. negare logică.otherwise :: Bool. Funcție constantă care returnează valoarea True .
Tipul Int
Valorile de acest tip sunt numere întregi cu precizie limitată care acoperă cel puțin intervalul [-2^29, 2^29 - 1] ([minBound, maxBound]).
Tipul întreg
Valorile de acest tip sunt numere întregi cu precizie nelimitată care au aceleași funcții și operatori ca și tipul Int.
Tipul Float
Valorile de acest tip sunt numere reale. (2010, 23.4, 5.7)
Funcții și operatori
(+), (-), (*), (/), (^) :: Float -> Float -> Float. Adunarea, scăderea, produsul, împărțirea reală și puterea exponentului întreg.abs, signum, negate :: Int -> Int. Valoarea absolută, semn și negație.(**) :: Float -> Float. Puterea exponentului real
Tipul dublu
Valorile de acest tip sunt numere reale, cu o gamă mai mare și cu aproximări mai precise decât cele de tip Float.
Tipul Char
Valorile de acest tip sunt caractere găsite într-o masă de complexitate ridicată a unei sume de caractere date cu definiția lor înaltă.
Înainte de a folosi această funcție în îmbrățișări, trebuie să folosim IMPORT CHAR înainte de algoritmul nostru.
Tupluri
Elementele care alcătuiesc un tuplu pot fi de aceleași tipuri sau diferite. Este un set de componente înrudite. De exemplu: ('a', True,3)
Liste
Valorile de acest tip sunt o colecție de elemente de același tip. Există doi constructori pentru liste:
- [Elemente_separate_prin_virgule], de exemplu:
[1,2,3,4] - (primul_element:restul_listei), de exemplu:
(1:(2:(3:(4:[]))))
Implementări
Toate implementările următoare sunt pe deplin sau aproape în totalitate conforme cu standardele Haskell 98 și sunt distribuite sub licențe Open Source . Nu se cunosc implementări comerciale ale limbajului.
- Hugs ([1]) esteinterpret. Oferă o compilare rapidă a programelor și un timp de execuție rezonabil. De asemenea, vine cu o bibliotecă grafică foarte simplă, făcându-l potrivit pentru cei care tocmai o învață. Cu toate acestea, nu este o implementare de disprețuit, este una dintre cele mai ușoare și compatibile.
- GHC ([2]): „Glasgow Haskell Compiler” se compilează în cod nativ pe o varietate dearhitecturiși poate compila și înC. Este probabil unul dintre celecompilatoareși are chiar și câteva biblioteci (de exempluOpenGL) care, deși foarte utile, funcționează doar sub GHC.
- nhc98 ( [3] ) este un alt compilator cu un timp de rulare mai bun decât Hugs. Această implementare s-a concentrat pe minimizarea utilizării memoriei, ceea ce o face o alegere bună pentru arhitecturile lente sau mai vechi.
- HBC ( [4] ) este un alt compilator pentru codul nativ Haskell. Deși nu a fost actualizat în ultima vreme, este totuși destul de util.
- Heliul ( [5] ) este un nou dialect al lui Haskell. S-a concentrat pe a fi foarte ușor de învățat; prin urmare, nu include suport pentru întregul standard Haskell, ceea ce îl face pe deplin compatibil.
Medii de dezvoltare
Există mai multe IDE-uri (Integrated Development Environment, sau în spaniolă, medii de dezvoltare integrate) și/sau plugin-uri care pot fi folosite pentru a dezvolta aplicații în Haskell. Majoritatea sunt open source, dar există și licențe comerciale.
Open Source
- Plugin IntelliJ pentru Haskell
- Plugin EclipseFP pentru Eclipse IDE
- Plugin de colorare pentru Eclipse IDE
- Leksah
- KDevelop
- vim
- emacs
- Atom
Reclame
- Haskell pentru Mac
- Sublime-Haskell
Cadre web
Comunitatea de dezvoltare web Haskell a avut recent un impuls uriaș în activitate, rezultând o multitudine de opțiuni de bibliotecă de utilizat. [ 7 ] Mai jos este lista cadrelor active din Haskell pentru dezvoltarea web.
Happstack
Este conceput astfel încât dezvoltatorii să poată face prototipuri rapid, să poată implementa fără durere, să se extindă masiv, să opereze fiabil și să se schimbe cu ușurință. Suportă medii GNU/Linux , macOS , FreeBSD și Windows .
Este considerat un cadru web complet, componenta principală este happstack-server: un server HTTP integrat , combinatoare de rutare și servere de fișiere. În plus, o serie de pachete care au fost cuplate cu Happstack au fost acum decuplate de acesta, dar sunt încă promovate și documentate pentru a fi utilizate cu Happstack:
- Safecopy: suport pentru serializare și migrarea tipurilor de date
- Acid-state: un sistem de stocare NoSQL ACID cu suport nativ pentru tipurile Haskell
Snap
Este un cadru de dezvoltare web bazat pe o arhitectură snaplet.
Are o documentație extinsă și o suită de testare cu un nivel ridicat de acoperire a codului, dar este un software în stadiu incipient, cu interfețe în continuă evoluție.
Yesod
Este conceput pentru aplicații web de înaltă performanță, sigure pentru tipare și REST.
Folosind aproape listarea pentru cele mai ușoare sarcini, sunt furnizate aplicații web concise cu niveluri ridicate de securitate. Șabloanele Hamlet sunt verificate în momentul compilării pentru corectitudine, iar controlorul folosește adrese URL sigure pentru a se asigura că generează numai adrese URL valide. Urmează vag principiile Model-View-Controller .
Miku
O bibliotecă simplă pentru prototipare web rapidă în Haskell, inspirată de Ruby's Rack și Sinatra .
Lemmachine
Este un cadru web RESTful. Arhitectura principală este o copie a Webmachine bazată pe Erlang , care este în prezent cea mai bună referință pentru documentație. Se remarcă prin Webmachine dinamică scrisă într-o formă tastată dependent în Agda.
Mohws
Este un server web cu un sistem de module și suport pentru CGI . Bazat pe serverul web Haskell original al lui Simon Marlow.
Sage
Este un server web și un cadru de aplicații web care poate fi folosit pentru a scrie site-uri web dinamice în Haskell. De la codul de protocol de nivel inferior la codul de aplicație de nivel superior, totul este scris ca un driver Salvia. Această abordare face serverul extrem de extensibil.
Scotty
Este un cadru web inspirat de Ruby's Sinatra, folosind WAI și Warp. Este o modalitate ușoară de a scrie aplicații web RESTful și declarative. Are o documentație bună pentru toate funcțiile relevante.
servitor
Este un cadru ușor, în principal pentru API-urile REST. Vă permite să specificați specificațiile unui API ca aliasuri de tip și apoi să lucrați cu aceste aliasuri de tip pentru a crea servere, documentație, cod client în Haskell și Javascript . Se bazează pe WAI.
MFlow
Este un server de aplicații web. MFlow este o abreviere pentru „Message Flow”. Este un cadru bazat pe continuare, în loc de alte cadre bazate pe continuare, cum ar fi Ocsigen (Ocaml), Coccoon (javascript) sau Seaside (Smalltalk), se bazează pe o monada de backtracking care menține sincronizarea stării de execuție cu navigarea utilizatorului. De la întreruperea WASH , MFlow este singurul cadru în stil de continuare scris în Haskell până în prezent.
Utilizează bibliotecile web standard și/sau tehnice Haskell: WAI , Warp , Blaze HTML, HSP. Nucleul său este serverul și redarea independentă. O clasă de forme extinse sunt folosite pentru a crea componente autonome, numite widget-uri. Au formatare, AJAX și cod de server. Ele pot fi compuse pentru a crea interfața cu utilizatorul.
Spock
Este un cadru pentru dezvoltare web rapidă: oferă tot ce aveți nevoie pentru a începe rapid hacking-ul web cu Haskell: rutare, middleware , JSON , blaze, sesiuni, cookie -uri , ajutor de bază de date , protecție csrf , stare globală.
web
Este un cadru WAI pentru a crea aplicații web robuste, de concurență ridicată, simple și eficiente. Scopul său principal este de a extinde funcționalitatea bibliotecii de bază WAI și de a oferi un punct de intrare ușor în serverele web Haskell. Facilitează crearea pluginurilor . Pluginurile pot adăuga rute, middleware, configurații și chiar pot gestiona curățarea resurselor la închiderea serverului. Rutele numite permit pluginurilor să-și genereze dinamic rutele în timpul rulării, pe baza configurației
WebAPI
WebApi este o bibliotecă ușoară bazată pe WAI care vă permite să definiți cererile și răspunsurile la punctele finale ca tipuri printr-un contract. Contractul este considerat singura sursă de adevăr, cu ajutorul căreia WebApi vă permite să creați REST API/servicii Web, să generați un client Haskell pentru serviciile API existente, să generați un server simulator pentru a simula cereri și răspunsuri.
DAML
Este un cadru de contract inteligent bazat pe Glasgow Haskell Compiler .
Comunitate
Simpozionul Haskell
„The Haskell Symposium” este un simpozion anual organizat de Conferința Internațională de Programare Funcțională (ICFP). Simpozionul este sponsorizat de Asociația pentru Mașini de Calcul (ACM), sub auspiciile Grupului de Interes Special ACM pentru limbaje de programare (SIGPLAN).
Scopul evenimentului este de a discuta despre experiența programatorilor cu Haskell și despre dezvoltarea viitoare a limbajului. Scopul simpozionului include toate aspectele de proiectare, semantică, teorie, implementare, implementare și predare a lui Haskell.
Înainte de 2008, evenimentul era cunoscut sub numele de „ Atelierul Haskell ”. Schimbarea numelui reflectă influența din ce în ce mai mare a evenimentului asupra comunității în general, precum și un număr tot mai mare de trimiteri de înaltă calitate care fac procesul de acceptare foarte competitiv.
Vara lui Haskell
„ The Summer of Haskell ” este un eveniment organizat de haskell.org pentru a ajunge la studenți și a-i încuraja să contribuie la comunitatea Haskell cu ajutorul mentorilor cu experiență. Acest program este deschis studenților universitari, cu vârsta peste 18 ani, în majoritatea țărilor.
Exemple
Funcție recursivă pentru a calcula factorialul unui număr natural:
--Funcție recursivă care calculează factorialul unui factorial cu număr natural :: Întreg -> Factorial întreg
n | n < 0 = eroare „factorial pentru numere întregi negative nu există” | n == 0 = 1 | altfel = n * factorial ( n - 1 )
O altă versiune a funcției pentru a calcula factorialul unui natural folosind funcția de produs a modulului Data.List :
--Funcție de calculare a factorialului unui număr întreg folosind funcția de produs a
factorial al modulului Data.List :: Integer -> Integer
factorial n
| n < 0 = eroare „factorial pentru numere întregi negative nu există”
| altfel = produs [ 1 .. n ]
Funcția de sumă a elementelor unei liste de numere întregi
--Adăugați elemente dintr-o listă
adăugați :: [ Int ] -> Int
adăugați [] = 0
adăugați ( x : xs ) = x + adăugați ( xs )
Funcție pentru a calcula rădăcinile unei ecuații pătratice din coeficienții ei
--Funcție de calculare a rădăcinilor unei ecuații pătratice din coeficienții
rădăcinii acesteia :: Float -> Float -> Float -> ( Float , Float )
rădăcini a b c
| disc >= 0 = (( - b + discSqrt ) / denom ,
( - b - discSqrt ) / denom )
| altfel = eroare „Ecuația are rădăcini complexe”
unde
disc = b * b - 4 * a * c
discRoot = sqrt disc
denom = 2 * a
Funcție care aproximează numărul e
--Funcția de calculare a valorii lui e (2.71828182845905)
euler :: Double -> Double
euler 0.0 = 1.0
euler n = 1.0 / produs [ 1 .. n ] + euler ( n - 1.0 )
Funcție pentru a calcula cel mai mare divizor comun a două numere întregi folosind algoritmul lui Euclid
gcd :: Int -> Int -> Int
gcd x 0 = x
gcd x y = gcd y ( mod x y )
Funcția care efectuează sita lui Eratosthenes (a unei liste date lasă doar numerele prime )
eratosthenes :: [ Int ] -> [ Int ]
eratosthenes [] = []
eratosthenes ( x : xs ) | nu ( null xs ) && x ^ 2 > ultimul xs = ( x : xs )
| altfel = x : eratosthenes [ y | y <- xs , y ` mod ` x /= 0 ]
Funcție care determină dacă un număr natural este un palindrom (în baza 10)
isPalindrom :: Int -> Bool
isPalindrom n
| n < 0 = Fals
| altfel = fie s = arată n
în s == ( invers s )
Funcție care realizează puterea unui număr cu recursivitate prin împărțirea fișierului la 2
putere :: Double -> Int -> Double
putere b e = dacă e < 0 atunci 1 / ( putere b ( - e ))
else if e == 0 atunci 1
altfel fie p = putere b ( e ` div ` 2 )
în if e ` mod ` 2 == 1 atunci p * p * b else p * p
Funcție care evaluează leneș lista de numere prime folosind o clauză where și liste intenționate
PrimeNumbers :: [ Integer ]
PrimeNumbers = 2 : [ p | p <- [ 3 .. ], este_prim p ]
unde
este_prim n
| chiar n = Fals
| altfel = nul [ m | m <- [ 3 , 5 .. div n 2 ], mod n m == 0 ]
Implementarea algoritmului Quicksort
qsort :: ( Ord a ) => [ a ] -> [ a ]
qsort [] = []
qsort ( x : xs ) = qsort [ y | y <- xs , y <= x ] ++ [ x ] ++ qsort [ y | y <- xs , y > x ]
Vezi și
Note și referințe
- ↑ Chevalier, Tim (28 ianuarie 2008), « Oricine poate să-mi spună pronunția lui „haskell”? », Haskell-cafe mailing list , http://www.haskell.org/pipermail/haskell-cafe/2008-January/038756.html , accesat la 12 martie 2011 .
- ^ „Prefață” . Haskell 98 Limba și bibliotecile: Raportul revizuit . decembrie 2002.
- ^ „Istoria lui Haskell” . Arhivat din original pe 29 aprilie 2009.
- ↑ Simon Peyton Jones (decembrie 2002). „Limba și bibliotecile Haskell 98: Raportul revizuit” .
- ^ „Dezvoltarea viitoare a lui Haskell” .
- ^ „ Bine ați venit la Haskell ” . Wiki Haskell . Arhivat din original pe 23 aprilie 2009 . Recuperat la 5 mai 2007 .
- ↑ „Web - HaskellWiki” . wiki.haskell.org (în engleză) . Consultat la 26 iunie 2017 .
Bibliografie
- Ruiz, Blas; Gutierrez, Francisco; Războinicul, Paul; și Gallardo, Jose. Raționând cu Haskell. Un curs de programare funcțională. Thomson.
Link- uri externe
Spaniolă:
- Exemplu de majoritatea caracteristicilor Haskell
- Introducere în Haskell Arhivat 2010-04-05 la Wayback Machine .
- Limbajul de programare funcțional Haskell Haskell Basics
- A Gentle Introduction to Haskell Versiunea în spaniolă a cărții „A Gentle Introduction to Haskell”.
- Învață Haskell de dragul tuturor! Traducerea lucrării „Learn you a Haskell for great good”.
- Haskell Basics Haskell Curs
Engleză:
- Exemplu de majoritatea caracteristicilor Haskell
- Pagina oficială Haskell Haskell
- Haskell în exemple Exemple de utilizare a Haskell
- Încercați Haskell Încercați Haskell online
- O introducere blândă în Haskell 98 ( format pdf )
- Evoluția unui programator Haskell Un mod plin de umor de a privi diferitele stiluri de programare din Haskell
- Bibliografia online a cercetării Haskell Bibliografia cercetării Haskell
- Haskell (limbaj de programare)
- Învață-ți un Haskell pentru un mare bine
Implementări:
- Îmbrățișează sistemul Gofer al utilizatorului Haskell
- GHC Compilatorul Glasgow Haskell
- Heliu , Heliu