Haskell
ParadigmaProgramim plotësisht funksionalë
E projektuar ngaLennart 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
Doli më1990; 34 vite më parë (1990)[1]
Emetimi i funditHaskell 2010[2] / Data :e|2010|07|df=yes}
Lëshimi fundit jo i qëndrueshëmHaskell 2020 announced[3]
ImplementimiGHC, Hugs, NHC, JHC, Yhc, UHC
DialektiGofer
Ndikuar ngaClean,[4] FP,[4] Gofer,[4] Hope and Hope+,[4] Id,[4] ISWIM,[4] KRC,[4] Lisp,[4]
Miranda,[4] ML and Standard ML,[4] Orwell, SASL,[4] Scheme,[4] SISAL[4]
Ndikoi nëAgda,[5] Bluespec,[6] C++11/Concepts,[7]
C#/LINQ,[8][9][10][11] CAL,[nevojitet citimi] Cayenne,[8] Clean,[8] Clojure,[12]
CoffeeScript,[13] Curry,[8] Elm,
Epigram,[nevojitet citimi] Escher,[14] F#,[15] Hack,[16] Idris,[17]
Isabelle,[8] Java/Generics,[8] LiveScript,[18]
Mercury,[8] Ωmega, PureScript,[19] Python,[8][20] Raku,[21]
Rust,[22] Scala,[8][23] Swift,[24]
Visual Basic 9.0[8][9]
SOCross-platform
Filename extension(s).hs, .lhs
Websitehaskell.org

Haskell ( /ˈ h æ s k əl / ) është një gjuhë programimi me qëllime të përgjithshme,të shtypura statike,plotësisht funksionale me konkluzion të tipit dhe vlerësim dembel.[25] Projektuar për mësimdhënie,kërkime dhe aplikime industriale,Haskell ka qenë pionier i disa veçorive të gjuhëve të programimit si klasat e tipit,të cilat mundësojnë mbingarkimin e sigurtë të operatorit për tipa dhe hyrjen/daljen monadike (IO). Është emëruar pas logjikuesitHaskell Curry. [1]Implementimi kryesor i Haskell është kompilatori Haskell i Glasgow (GHC).

Semantikat e Haskell-it bazohet historikisht në ato të gjuhës programuese Miranda, e cila shërbeu për të fokusuar përpjekjet e grupit fillestar të punës Haskell. Specifikimi i fundit formal i gjuhës u bë në korrik të vitit 2010, ndërsa zhvillimi i GHC vazhdon të zgjerojë Haskell-in përmes zgjerimeve gjuhësore.

Haskell përdoret në akademi dhe industri.[26][27][28] Që prej majit të vitit 2021, Haskell ishte gjuha e 28-të më e njohur e programimit nga kërkimet e Google për mësime,[29] dhe përbëhet nga më pak se 1% e përdoruesve aktivë në depon e kodit burimor GitHub .[30]

Historia

Redakto

Pas publikimit të Miranda nga Softueri Kërkimor i Kufizuar në vitin 1985, interesi për gjuhët funksionale dembele u rrit. Deri në vitin 1987, ekzistonin më shumë se një duzinë gjuhë programimi jo strikte, thjesht funksionale. Miranda ishte më e përdorura, por ishte softuer pronësor . Në konferencën mbi Gjuhët e Programimit Funksional dhe Arkitektura Kompjuterike (FPCA '87) në Portland, Oregon, pati një konsensus të fortë që të formohej një komitet për të përcaktuar një standard të hapur për gjuhë të tilla. Qëllimi i komitetit ishte të konsolidonte gjuhët funksionale ekzistuese në një gjuhë të përbashkët, e cila do të shërbente si bazë për kërkime të ardhshme në dizajnin e gjuhës funksionale. [25]

Haskell 1.0 deri në 1.4

Redakto

Haskell u zhvillua nga një komitet, duke u përpjekur të bashkojë zgjidhje të gatshme, aty ku ishte e mundur.

Klasat e tipeve, të cilat mundësojnë tipin e sigurtë të mbingarkimit e operatorit, u propozuan fillimisht nga Philip Wadler dhe Stephen Blott për të adresuar trajtimin ad-hoc të llojeve të barazisë dhe mbingarkimin aritmetik në gjuhët e asaj kohe.[31]

Në versionet e hershme të Haskell deri dhe duke përfshirë versionin 1.2, ndërveprimi i përdoruesit dhe hyrja/dalja (IO) trajtoheshin nga mekanizma të bazuar në rrjedha dhe ato të bazuara në vazhdueshmëri, të cilët konsideroheshin gjerësisht të pakënaqshëm.[32] Në versionin 1.3, IO monadic u prezantua, së bashku me gjeneralizimin e klasave të tipeve në llojet më të larta (ndërtuesit e tipeve). Së bashku me "Notacionin e Operatorit Diferencial", e cila siguron sheqer sintaksor për klasën e tipit Monad, kjo i dha Haskell një sistem efektesh që ruante transparencën referente dhe ishte i përshtatshëm.

Ndryshime të tjera të dukshme në versionet e hershme ishin qasja ndaj funksionit 'sekuencë', i cili krijon një varësi të të dhënave midis vlerave, dhe përdoret në gjuhët dembele për të shmangur konsumimin e tepërt të memories; duke lëvizur nga një klasë tipi në një funksion standard për ta bërë rifaktorimin më praktik.

Versioni i parë i Haskell ("Haskell 1.0") u përcaktua në vitin 1990. [1] Përpjekjet e komitetit rezultuan në një sërë përkufizimesh gjuhësore (1.0, 1.1, 1.2, 1.3, 1.4).

 
Hierarkia e klasave të tipit në preludin e Haskell-it që nga GHC 7.10. Përfshirja e Foldable dhe Transable (me ndryshimet përkatëse në nënshkrimet e tipit të disa funksioneve) dhe e Applicative si ndërmjetëse midis Functor dhe Monad, janë devijime nga standardi Haskell 2010.

Haskell 98

Redakto

Në fund të vitit 1997, seria arriti kulmin në Haskell 98, që synonte të specifikonte një version të qëndrueshëm, minimal, portativ të gjuhës dhe një bibliotekë standarde shoqëruese për mësimdhënie, dhe si bazë për zgjerime të ardhshme. Komiteti mirëpriti krijimin e shtesave dhe varianteve të Haskell 98 nëpërmjet shtimit dhe përfshirjes së veçorive eksperimentale. [25]

Në shkurt 1999, standardi i gjuhës Haskell 98 u botua fillimisht si Raporti Haskell 98 . [25] Në janar 2003, u botua një version i rishikuar si "Haskell 98 Gjuha dhe Bibliotekat: Raporti i Rishikuar".[25] Kjo gjuhë vazhdon të evoluojë me shpejtësi, me zbatimin e Kompilatorit Glasgow Haskell (GHC) që përfaqëson standardin aktual de fakto .[33]

Haskell 2010

Redakto

Në fillim të vitit 2006, filloi procesi i përcaktimit të një pasardhësi të standardit Haskell 98, i quajtur zyrtarisht Haskell Prime .[34] Ky synohej të ishte një proces i vazhdueshëm në rritje për të rishikuar përkufizimin e gjuhës, duke prodhuar një rishikim të ri të gjuhës deri në një herë në vit. Rishikimi i parë, i quajtur Haskell 2010, u shpall në nëntor 2009 dhe u botua në korrik 2010.

Haskell 2010 është një përditësim në rritje i gjuhës, kryesisht duke përfshirë disa veçori të mirëpërdorura dhe të padiskutueshme të aktivizuara më parë nëpërmjet flamujve specifikë të kompilatorit.

  • Emrat e moduleve hierarkike. Emrat e moduleve lejohen të përbëhen nga sekuenca të ndara me pika të identifikuesve me shkronja të mëdha, në vend që të përmbajnë vetëm një identifikues të tillë.. Kjo lejon që modulet të emërtohen në një mënyrë hierarkike (p.sh. Data.List në vend të List ), megjithëse teknikisht modulet janë ende në një hapësirë emrash monolitike. Kjo shtesë u specifikua në një shtesë të Haskell 98 dhe në praktikë u përdor në mënyrë universale.
  • Ndërfaqja e funksionit të huaj (FFI) lejon lidhjet me gjuhë të tjera programimi. Vetëm lidhjet me C janë të specifikuara në Raport, por dizajni lejon lidhje edhe me gjuhë të tjera. Për ta mbështetur këtë, deklaratat e tipeve të të dhënave lejuan ato të mos përmbajnë asnjë konstruktorë, duke mundësuar lloje të forta nonce për të dhëna të huaja që nuk mund të krijoheshin në Haskell. Kjo shtesë është specifikuar më parë në një Shtojcë të Raportit Haskell 98 dhe është përdorur gjerësisht.
  • Të ashtuquajturat modelet n + k (përkufizimet e formës fact (n+1) = (n+1) * fact n ) nuk lejoheshin më. Ky sheqer sintaksor kishte semantikë mashtruese, në të cilën kodi dukej sikur përdorte operatorin (+), por në fakt desugarohej në kod që përdorte (-) dhe (>=).
  • Rregullat e konkluzionit të tipeve u lehtësuan për të lejuar më shumë programe të kontrollonin tipet.
  • Disa probleme sintaksore (ndryshime në gramatikën formale) u rregulluan: u shtuan mbrojtëse modeli, duke lejuar përputhjen e modeleve brenda mbrojtësve;rezolucioni i fiksimit të operatorit u specifikua në një mënyrë më të thjeshtë që pasqyronte praktikën aktuale; u trajtua një rast i favorshëm në ndërveprimin e sintaksës leksikore të gjuhës së operatorëve dhe komenteve, dhe ndërveprimi i shënimeve të bëra dhe "nëse-atëherë-tjetër" u ndryshuan për të eliminuar gabimet e papritura sintaksore.
  • Pragma LANGUAGE u specifikua. Deri në vitin 2010, dhjetëra shtesa të gjuhës ishin në përdorim të gjerë dhe GHC (mes kompilatorëve të tjerë) siguroi pragmën LANGUAGE për të specifikuar shtesat individuale me një listë identifikuesish. Kompilatorët e Haskell 2010 kërkohet të mbështesin shtesën Haskell2010 dhe inkurajohen të mbështesin disa të tjera, të cilat korrespondojnë me shtesat e shtuara në Haskell 2010.

Standardet e së ardhmes

Redakto

Specifikimi tjetër formal ishte planifikuar për vitin 2020. Më 29 tetor 2021, me versionin GHC 9.2.1, u lëshua shtesa GHC2021. Ndërsa ky nuk është një specifikim formal i gjuhës, ai kombinon disa shtesa të qëndrueshme, të përdorura gjerësisht të GHC për Haskell 2010.

Veçoritë

Redakto

Haskell përmban vlerësimin dembel, shprehjet lambda, përputhjen e modelit, kuptimin e listës, klasat e tipit dhe polimorfizmin e tipit . Është një gjuhë programimi plotësisht funksionale, që do të thotë se funksionet në përgjithësi nuk kanë efekte anësore . Ekziston një konstrukt i veçantë për të përfaqësuar efektet anësore, ortogonale me llojin e funksioneve. Një funksion i pastër mund të kthejë një efekt anësor që ekzekutohet më pas, duke modeluar funksionet e papastra të gjuhëve të tjera.

Haskell ka një sistem të fortë, statik të tipit të bazuar në konkluzionet e tipit Hindley-Milner . Risia e saj kryesore në këtë fushë janë klasat e tipit, e konceptuar fillimisht si një mënyrë parimore për të shtuar mbingarkimin në gjuhë,[35] por që më pas gjeti shumë përdorime të tjera.[36]

Konstrukti që përfaqëson efektet anësore është një shembull i një monade : një kornizë e përgjithshme që mund të modelojë llogaritje të ndryshme si trajtimin e gabimeve, jodeterminizmin, analizën dhe memorien transaksionale të softuerit . Ato përcaktohen si tipe të zakonshme të dhënash, por Haskell ofron disa sheqer sintaksor për përdorimin e tyre.

Haskell ka një specifikim të hapur, të publikuar, [25] dhe ka zbatime të shumta . Zbatimi i tij kryesor, kompilatori Glasgow Haskell (GHC), është njëkohësisht një përkthyes dhe përpilues i kodit vendas që funksionon në shumicën e platformave. GHC shquhet për sistemin e tij të pasur të tipit që përfshin inovacionet e fundit si llojet e përgjithësuara algjebrike të të dhënave dhe familjet e tipeve. Loja e standardeve të gjuhës kompjuterike gjithashtu thekson zbatimin e saj me performancë të lartë të konkurrencës dhe paralelizmit .

Një komunitet aktiv dhe në rritje ekziston rreth gjuhës, dhe më shumë se 5400 biblioteka dhe mjete me burim të hapur të palëve të treta janë të disponueshme në depon e paketave në internet Hackage .[37]

Shembuj kodesh

Redakto

Një "Përshëndetje, botë!" program në Haskell (vetëm rreshti i fundit është rreptësisht i nevojshëm):

module Main (main) where          -- nuk nevojitet ne interpretuues, është e parazgjedhur ne modul skedar

main :: IO ()                     -- Kompilatori mund ta inferojë këtë përkufizim tipi
main = putStrLn "Pëshëndetje Botë!"

Funksioni faktorial në Haskell, i përcaktuar në disa mënyra të ndryshme (rreshti i parë është shënimi i tipit, i cili është opsional dhe është i njëjtë për çdo zbatim):

factorial :: (Integral a) => a -> a

-- Përdorimi i rekruzionit (Me shprehjen "ifthenelse")
factorial n = if n < 2
       then 1
       else n * factorial (n - 1)

-- Përdorimi i rekruzionitn (me modele te përputhshme)
factorial 0 = 1
factorial n = n * factorial (n - 1)

-- Përdorimi i rekruzionit (me mbrojtje)
factorial n
  | n < 2   = 1
  | otherwise = n * factorial (n - 1)

-- Përdorimi i listës dhe funksioni i "product"
factorial n = product [1..n]

-- Përdorimi i përmbledhjes (implementon "product")
factorial n = foldl (*) 1 [1..n]

-- Stili pa pika
factorial = foldr (*) 1 . enumFromTo 1

Përdorimi i kombinatorit me pikë fikse të Haskell lejon që ky funksion të shkruhet pa ndonjë rekursion të qartë.

 import Data.Function (fix)

factorial = fix fac
 where fac f x
     | x < 2   = 1
     | otherwise = x * f (x - 1)

Duke qenë se lloji Integer ka saktësi arbitrare, ky kod do të llogarisë vlera të tilla si factorial 100000 (një numër 456,574-shifror), pa humbje të saktësisë.

Një zbatim i një algoritmi të ngjashëm me renditjen e shpejtë të listave, ku elementi i parë merret si strumbullar:

-- Lloji shënim (opsional,njësoj për të gjitha implementimet)
quickSort :: Ord a => [a] -> [a]

-- Përdorimi i të kuptuarit e listës
quickSort []   = []                -- Lista boshe është renditur
quickSort (x:xs) = quickSort [a | a <- xs, a < x]  -- Rendit pjesën e majtë të listës
          ++ [x] ++            -- Fusni bohtin mes dy anëve të renditura
          quickSort [a | a <- xs, a >= x] -- Rendit pjesën e djathtë të listës

-- Përdorimi i filterit
quickSort []   = []
quickSort (x:xs) = quickSort (filter (<x) xs)
          ++ [x] ++
          quickSort (filter (>=x) xs)

Zbatimet

Redakto

Të gjitha implementimet e listuara shpërndahen nën licencat me burim të hapur .

Zbatimet që plotësisht ose përafërsisht përputhen me standardin Haskell 98 përfshijnë:

  • Kompilatori Glasgow Haskell (GHC) kompilon në kodin vendas në shumë arkitektura të ndryshme procesorësh dhe në ANSI C, përmes njërës prej dy gjuhëve të ndërmjetme : C--, ose në versionet më të fundit, në kodin bit LLVM (dikur Makina Virtuale e Nivelit të Ulët).[38] GHC është bërë dialekt standard de facto Haskell. Ka biblioteka (p.sh., lidhjet me OpenGL ) që punojnë vetëm me GHC. GHC u shpërnda edhe me platformën Haskell .
  • Jhc, një kompilator Haskell i shkruar nga John Meacham, thekson shpejtësinë dhe efikasitetin e programeve të krijuara dhe eksploron transformimet e reja të programeve.
  • Ajhc është një version i pasur i Jhc.
  • Kompilatori i i Utrecht Haskell (UHC) është një zbatim i Haskell nga Universiteti i Utrecht . Ai mbështet pothuajse të gjitha veçoritë e Haskell 98 plus shumë shtesa eksperimentale. Zbatohet duke përdorur gramatikat e atributeve dhe përdoret kryesisht për kërkime mbi sistemet e tipit të gjeneruar dhe zgjerimet gjuhësore.

Zbatimet që nuk mbahen më në mënyrë aktive përfshijnë:

  • Sistemi Gofer i Përdoruesit të Haskell ( Hugs ) është një përkthyes i kodit binar . Dikur ishte një nga implementimet më të përdorura, së bashku me kompilatorin GHC, [1] por tani është zëvendësuar kryesisht nga GHCi. Ai gjithashtu vjen me një bibliotekë grafike.
  • HBC është një zbatim i hershëm që mbështet Haskell 1.4. Ai u zbatua nga Lennart Augustsson, dhe bazua në Lazy ML . Nuk është zhvilluar në mënyrë aktive për disa kohë.
  • nhc98 është një kompilator kodi binar që fokusohet në minimizimin e përdorimit të memories.
    • Hartuesi i York Haskell ( Yhc ) ishte një version i pasur i nhc98, me synimet për të qenë më i thjeshtë, më i lëvizshëm, më efikas, dhe për të integruar mbështetje për Hat, gjurmuesin Haskell. Ai gjithashtu kishte një prapavijë JavaScript, duke i lejuar përdoruesit të ekzekutonin programet Haskell në shfletuesit e internetit .

Implementimet që nuk janë plotësisht në përputhje me Haskell 98, dhe që përdorin një variant të gjuhës Haskell, përfshijnë:

  • Eta dhe Frege janë dialekte të Haskell që synojnë makinën virtuale Java (JVM).
  • Gofer është një dialekt arsimor i Haskell, me një veçori të quajtur klasa konstruktori, e zhvilluar nga Mark Jones. Ai është zëvendësuar nga Sistemi Gofer i Përdoruesit Haskell (Përqafimet).
  • Helium, një dialekt më i ri i Haskell. Fokusi është në lehtësimin e mësimit nëpërmjet mesazheve më të qarta të gabimeve duke çaktivizuar klasat e tipit si parazgjedhje.

Aplikacione të dukshme

Redakto
  • Agda është një asistente provash e shkruar në Haskell.[39]
  • Cabal është një mjet për ndërtimin dhe paketimin e bibliotekave dhe programeve Haskell.[40]
  • Darcs është një sistem kontrolli i rishikimit i shkruar në Haskell, me disa veçori inovative, të tilla si kontrolli më i saktë i arnimeve për t'u aplikuar.
  • Kompilatori Glasgow Haskell(GHC) është gjithashtu shpesh një shtrat testimi për veçoritë e avancuara të programimit funksional dhe optimizimet në gjuhë të tjera programimi.
  • Git-annex është një mjet për të menaxhuar skedarët e të dhënave (të mëdha) nën kontrollin e versionit Git . Ai gjithashtu siguron një sistem të shpërndarë sinkronizimi të skedarëve (asistent git-annex).
  • Linspire Linux zgjodhi Haskell për zhvillimin e mjeteve të sistemit.[41]
  • Pandoc është një mjet për të kthyer një format shënjimi në një tjetër.
  • Pugs është një kompiltor dhe përkthyes për gjuhën e programimit të quajtur atëherë Perl 6, por që nga ajo kohë u riemërua Raku .
  • TidalCycles është një gjuhë e veçantë e domenit për kodimin e drejtpërdrejtë të modeleve muzikore, e ngulitur në Haskell.[42]
  • Xmonad është një menaxher i dritareve për sistemin e dritareve X, i shkruar plotësisht në Haskell.
  • GarganText [43] është një mjet bashkëpunues për të hartuar tekste përmes analizës semantike në çdo shfletues uebi, i shkruar plotësisht në Haskell dhe PureScript, i cili përdoret për shembull në komunitetin e kërkimit për të hartuar raporte dhe udhërrëfyes më të avancuara.[44]

Industria

Redakto
  • Bluespec SystemVerilog (BSV) është një zgjerim gjuhësor i Haskell, për dizajnimin e elektronikës . Është një shembull i një gjuhe specifike të domenit të integruar në Haskell. Më tej, mjetet e Bluespec, Inc. janë implementuar në Haskell.
  • Cryptol, një gjuhë dhe zinxhir mjetesh për zhvillimin dhe verifikimin e algoritmeve të kriptografisë, është implementuar në Haskell.
  • Facebook zbaton programet e tij anti-spam [45] në Haskell, duke ruajtur bibliotekën themelore të aksesit të të dhënave si softuer me burim të hapur .[46]
  • Platforma e blockchain Cardano është implementuar në Haskell.[47]
  • GitHub zbatoi Semantic, një bibliotekë me burim të hapur për analizën, ndryshimin dhe interpretimin e kodit burimor të pabesueshëm, në Haskell.[48]
  • Gjuha e modelimit financiar të Standard Chartered Mu është Haskell sintaksor që funksionon në një kohë të rreptë ekzekutimi.[49]
  • seL4, mikrokerneli i parë i verifikuar zyrtarisht, përdori Haskell si një gjuhë prototipimi për zhvilluesin e OS.[50] :p.2Në të njëjtën kohë, kodi Haskell përcaktoi një specifikim të ekzekutueshëm me të cilin arsyetohej, për përkthim automatik nga mjeti i vërtetimit të teoremës.[50] :p.3Kështu, kodi Haskell shërbeu si një prototip i ndërmjetëm përpara përsosjes përfundimtare të C. [50] :p.3
  • Softueri i optimizimit të zinxhirit të furnizimit të dyqaneve Target është shkruar në Haskell.[51]
  • Co-Star [52]
  • Pjesa e pasme e Merkurit është shkruar në Haskell.[53]

Rrjeti

Redakto

Kornizat e dukshme të rrjetit të shkruara për Haskell përfshijnë: [54]

  • IHP
  • Servant
  • Snap
  • Yesod

Kritika

Redakto

Jan-Willem Maessen, në 2002, dhe Simon Peyton Jones, në 2003, diskutuan problemet që lidhen me vlerësimin dembel, duke pranuar gjithashtu motivet teorike për të.[55] Përveç konsideratave praktike si përmirësimi i performancës,[56] ata vërejnë se vlerësimi dembel e bën më të vështirë për programuesit që të arsyetojnë për performancën e kodit të tyre (veçanërisht për përdorimin e hapësirës).

Bastiaan Heeren, Daan Leijen dhe Arjan van IJzendoorn në vitin 2003 vunë re gjithashtu disa pengesa për mësuesit e Haskell: "Sintaksa delikate dhe sistemi i tipit të sofistikuar të Haskell janë një shpatë me dy tehe – vlerësohet shumë nga programuesit me përvojë, por gjithashtu një burim zhgënjimi midis fillestarëve, meqenëse përgjithësimi i Haskell shpesh çon në mesazhe gabimi të paqarta." [57] Për të adresuar mesazhet e gabimit, studiuesit nga Universiteti Utrecht zhvilluan një përkthyes të avancuar të quajtur Helium, i cili përmirësoi lehtësinë e përdorimit të mesazheve të gabimit duke kufizuar përgjithësinë e disa veçorive të Haskell. Në veçanti, ai çaktivizon klasat e tipit si parazgjedhje.[58]

Ben Lippmeier projektoi Disciple [59] si një dialekt të rreptë nga parazgjedhja (dembel nga shënimi i qartë) i Haskell me një sistem tip-dhe-efekt, për të trajtuar vështirësitë e Haskell në arsyetimin rreth vlerësimit dembel dhe në përdorimin e strukturave tradicionale të të dhënave si p.sh. vargje të ndryshueshme . Ai argumenton (f. 20) se "përditësimi shkatërrues i jep programuesit dy mjete të rëndësishme dhe të fuqishme ... një set strukturash të dhënash të ngjashme me vargjet për menaxhimin e koleksioneve të objekteve dhe … aftësinë për të transmetuar një vlerë të re në të gjitha pjesët e një programi me ngarkesë minimale për programuesin."

Robert Harper, një nga autorët e Standard ML,ka dhënë arsyet e tij përse nuk e përdor Haskell për të mësuar programim hyrës. Ndër këto janë vështirësia e arsyetimit për përdorimin e burimeve me vlerësim jo-strikt,fakti që vlerësimi dembel e ndërlikon përcaktimin e tipit të të dhënave dhe arsyetimin induktiv,[60] dhe "inferioriteti" i sistemit (të vjetër) të klasave të Haskell-it në krahasim me sistemin e moduleve të ML.[61]

Mjeti i ndërtimit të Haskell, Cabal, është kritikuar historikisht për trajtimin e dobët të versioneve të shumta të së njëjtës bibliotekë, një problem i njohur si "ferri i kabalit". Serveri Stackage dhe mjeti i ndërtimit të Stack, u krijuan në përgjigje të këtyre kritikave.[62] Vetë Cabal tani ka një sistem ndërtimi shumë më të sofistikuar, të frymëzuar thellësisht nga Nix,[63] i cili u bë i paracaktuar me versionin 3.0.

Gjuhë të ngjashme

Redakto

Clean është një i afërm pak më i vjetër i Haskell. Devijimi i tij më i madh nga Haskell është përdorimi i tipeve unike në vend të monadave për hyrje/dalje (I/O) dhe efekteve anësore.

Një seri gjuhësh të inspiruara nga Haskell, por janë zhvilluar me sisteme të ndryshme të tipeve, duke përfshirë::

  • Agda, një gjuhë funksionale me tipa të varur .
  • Cayenne, me tipe të varura.
  • Elm, Një gjuhë funksionale për krijimin e aplikacioneve të front-end për web, pa mbështetje për klasa ose instanca të tipave të përcaktuara nga përdoruesi ose klasa të tipave të nivelit të lartë.
  • Epigram, një gjuhë funksionale me lloje të varura të përshtatshme për të vërtetuar vetitë e programeve.
  • Idris, një gjuhë funksionale për qëllime të përgjithshme me lloje të varura, e zhvilluar në Universitetin e St Andrews .
  • PureScript kalon në JavaScript.
  • Ωmega, një gjuhë strikte që lejon futjen e llojeve të reja dhe programimin në nivel tipi.

Gjuhë të tjera të ngjashme përfshijnë:

  • Curry, një gjuhë programimi funksionale/logjike e bazuar në Haskell.

Variantet e dukshme Haskell përfshijnë:

  • Haskell Gjenerik, një version i Haskell me mbështetje të sistemit të tipeve për programim gjenerik .
  • Hume, një gjuhë strikte funksionale për sistemet e integruara të bazuara në procese si automata pa shtetësi mbi një lloj tuplesh kanalesh të kutisë postare me një element ku gjendja mbahet nga reagimet në kutitë postare dhe një përshkrim hartografik nga daljet në kanale si instalime elektrike të kutisë, me një gjuhë dhe sintaksë të shprehjes si Haskell.

Konferenca dhe seminare

Redakto

Komuniteti Haskell takohet rregullisht për aktivitete kërkimore dhe zhvillimore. Ngjarjet kryesore janë:

  • Konferenca Ndërkombëtare për Programimin Funksional (ICFP)
  • Simpoziumi Haskell (dikur Workshopi Haskell)
  • Punëtoria e Implementuesve Haskell
  • Përdoruesit komercialë të programimit funksional (CUFP)
  • ZuriHac, lloj Hackathon që mbahet çdo vit në Cyrih

Duke filluar nga viti 2006, ka ndodhur një seri hakatonesh të organizuara, seria Hac, që synon përmirësimin e mjeteve dhe bibliotekave të gjuhës së programimit.[64]

Referencat

Redakto
  1. ^ a b c d Hudak etj. 2007.
  2. ^ Marlow, Simon (24 nëntor 2009). "Announcing Haskell 2010". Haskell (Listë abonentësh) (në anglisht). Marrë më 12 mars 2011.{{cite mailing list}}: Mirëmbajtja CS1: Datë e përkthyer automatikisht (lidhja)
  3. ^ Riedel, Herbert (28 prill 2016). "ANN: Haskell Prime 2020 committee has formed". Haskell-prime (Listë abonentësh). Marrë më 6 maj 2017. {{cite mailing list}}: Mungon ose është bosh parametri |language= (Ndihmë!)Mirëmbajtja CS1: Datë e përkthyer automatikisht (lidhja)
  4. ^ a b c d e f g h i j k l m Peyton Jones 2003, p. xi
  5. ^ Norell, Ulf (2008). "Dependently Typed Programming in Agda" (PDF) (në anglisht). Gothenburg: Chalmers University. Marrë më 9 shkurt 2012.{{cite web}}: Mirëmbajtja CS1: Datë e përkthyer automatikisht (lidhja)
  6. ^ Hudak etj. 2007, ff. 12–38, 43.
  7. ^ Stroustrup, Bjarne; Sutton, Andrew (2011). "Design of Concept Libraries for C++" (PDF). Software Language Engineering. Arkivuar nga origjinali (PDF) më 10 shkurt 2012. {{cite journal}}: Mungon ose është bosh parametri |language= (Ndihmë!)Mirëmbajtja CS1: Datë e përkthyer automatikisht (lidhja)
  8. ^ a b c d e f g h i j Hudak etj. 2007, ff. 12-45–46.
  9. ^ a b Meijer, Erik (2006). "Confessions of a Used Programming Language Salesman: Getting the Masses Hooked on Haskell". Oopsla 2007. CiteSeerX 10.1.1.72.868. {{cite journal}}: Mungon ose është bosh parametri |language= (Ndihmë!)
  10. ^ Meijer, Erik (1 tetor 2009). "C9 Lectures: Dr. Erik Meijer – Functional Programming Fundamentals, Chapter 1 of 13". Channel 9. Microsoft. Arkivuar nga origjinali më 16 qershor 2012. Marrë më 9 shkurt 2012. {{cite web}}: Mungon ose është bosh parametri |language= (Ndihmë!)Mirëmbajtja CS1: Datë e përkthyer automatikisht (lidhja)
  11. ^ Drobi, Sadek (4 mars 2009). "Erik Meijer on LINQ". InfoQ. QCon SF 2008: C4Media Inc. Marrë më 9 shkurt 2012. {{cite news}}: Mungon ose është bosh parametri |language= (Ndihmë!)Mirëmbajtja CS1: Datë e përkthyer automatikisht (lidhja) Mirëmbajtja CS1: Vendodhja (lidhja)
  12. ^ Hickey, Rich. "Clojure Bookshelf". Listmania!. Arkivuar nga origjinali më 3 tetor 2017. Marrë më 3 tetor 2017. {{cite web}}: Mungon ose është bosh parametri |language= (Ndihmë!)Mirëmbajtja CS1: Datë e përkthyer automatikisht (lidhja)
  13. ^ Heller, Martin (18 tetor 2011). "Turn up your nose at Dart and smell the CoffeeScript". InfoWorld. Marrë më 2020-07-15. {{cite news}}: Mungon ose është bosh parametri |language= (Ndihmë!)
  14. ^ "Declarative programming in Escher" (PDF). Marrë më 7 tetor 2015. {{cite web}}: Mungon ose është bosh parametri |language= (Ndihmë!)Mirëmbajtja CS1: Datë e përkthyer automatikisht (lidhja)
  15. ^ Syme, Don; Granicz, Adam; Cisternino, Antonio (2007). Expert F#. Apress. fq. 2. F# also draws from Haskell particularly with regard to two advanced language features called sequence expressions and workflows. {{cite book}}: Mungon ose është bosh parametri |language= (Ndihmë!)
  16. ^ "Facebook Introduces 'Hack,' the Programming Language of the Future". WIRED. 20 mars 2014. {{cite magazine}}: Mungon ose është bosh parametri |language= (Ndihmë!)Mirëmbajtja CS1: Datë e përkthyer automatikisht (lidhja)
  17. ^ "Idris, a dependently typed language". Marrë më 26 tetor 2014. {{cite web}}: Mungon ose është bosh parametri |language= (Ndihmë!)Mirëmbajtja CS1: Datë e përkthyer automatikisht (lidhja)
  18. ^ "LiveScript Inspiration". Marrë më 4 shkurt 2014. {{cite web}}: Mungon ose është bosh parametri |language= (Ndihmë!)Mirëmbajtja CS1: Datë e përkthyer automatikisht (lidhja)
  19. ^ Freeman, Phil (2016). "PureScript by Example". Leanpub. Marrë më 23 prill 2017. {{cite web}}: Mungon ose është bosh parametri |language= (Ndihmë!)Mirëmbajtja CS1: Datë e përkthyer automatikisht (lidhja)
  20. ^ Kuchling, A. M. "Functional Programming HOWTO". Python v2.7.2 documentation. Python Software Foundation. Marrë më 9 shkurt 2012. {{cite web}}: Mungon ose është bosh parametri |language= (Ndihmë!)Mirëmbajtja CS1: Datë e përkthyer automatikisht (lidhja)
  21. ^ "Glossary of Terms and Jargon". Perl Foundation Perl 6 Wiki. The Perl Foundation. Arkivuar nga origjinali më 21 janar 2012. Marrë më 9 shkurt 2012. {{cite web}}: Mungon ose është bosh parametri |language= (Ndihmë!)Mirëmbajtja CS1: Datë e përkthyer automatikisht (lidhja)
  22. ^ "Influences – The Rust Reference". The Rust Reference. Marrë më 2023-12-31. {{cite web}}: Mungon ose është bosh parametri |language= (Ndihmë!)
  23. ^ Fogus, Michael (6 gusht 2010). "MartinOdersky take(5) toList". Send More Paramedics. Marrë më 9 shkurt 2012. {{cite web}}: Mungon ose është bosh parametri |language= (Ndihmë!)Mirëmbajtja CS1: Datë e përkthyer automatikisht (lidhja)
  24. ^ Lattner, Chris (3 qershor 2014). "Chris Lattner's Homepage". Chris Lattner. Marrë më 3 qershor 2014. 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. {{cite web}}: Mungon ose është bosh parametri |language= (Ndihmë!)Mirëmbajtja CS1: Datë e përkthyer automatikisht (lidhja)
  25. ^ a b c d e f Peyton Jones 2003.
  26. ^ Mossberg, Erik (2020-06-08), erkmos/haskell-companies (në English), marrë më 2020-06-22{{citation}}: Mirëmbajtja CS1: Gjuhë e panjohur (lidhja)
  27. ^ O'Sullivan, Bryan; Goerzen, John; Stewart, Donald Bruce (15 nëntor 2008). Real World Haskell: Code You Can Believe In (në anglisht). "O'Reilly Media, Inc.". fq. xxviii–xxxi. ISBN 978-0-596-55430-9.{{cite book}}: Mirëmbajtja CS1: Datë e përkthyer automatikisht (lidhja)
  28. ^ "Haskell in Production: Riskbook". Serokell Software Development Company (në anglisht). Marrë më 2021-09-07.
  29. ^ "PYPL PopularitY of Programming Language index". pypl.github.io (në anglisht). maj 2021. Arkivuar nga origjinali më 7 maj 2021. Marrë më 16 maj 2021.{{cite web}}: Mirëmbajtja CS1: Datë e përkthyer automatikisht (lidhja)
  30. ^ Frederickson, Ben. "Ranking Programming Languages by GitHub Users". www.benfrederickson.com (në anglisht). Marrë më 6 shtator 2019.{{cite web}}: Mirëmbajtja CS1: Datë e përkthyer automatikisht (lidhja)
  31. ^ Wadler, Philip (tetor 1988). "How to make ad-hoc polymorphism less ad hoc" (në anglisht).{{cite web}}: Mirëmbajtja CS1: Datë e përkthyer automatikisht (lidhja)
  32. ^ Peyton Jones, Simon (2003). "Wearing the hair shirt: a retrospective on Haskell". Microsoft (në anglisht).
  33. ^ "Haskell Wiki: Implementations" (në english). Marrë më 18 dhjetor 2012.{{cite web}}: Mirëmbajtja CS1: Datë e përkthyer automatikisht (lidhja) Mirëmbajtja CS1: Gjuhë e panjohur (lidhja)
  34. ^ "Welcome to Haskell'". The Haskell' Wiki (në anglisht). Arkivuar nga origjinali më 20 shkurt 2016. Marrë më 11 shkurt 2016.{{cite web}}: Mirëmbajtja CS1: Datë e përkthyer automatikisht (lidhja)
  35. ^ Wadler, P.; Blott, S. (1989). "How to make ad-hoc polymorphism less ad hoc". Proceedings of the 16th ACM SIGPLAN-SIGACT symposium on Principles of programming languages – POPL '89 (në english). ACM. fq. 60–76. doi:10.1145/75277.75283. ISBN 978-0-89791-294-5.{{cite book}}: Mirëmbajtja CS1: Gjuhë e panjohur (lidhja)
  36. ^ Hallgren, T. (janar 2001). "Fun with Functional Dependencies, or Types as Values in Static Computations in Haskell". Proceedings of the Joint CS/CE Winter Meeting (në anglisht). Varberg, Sweden.{{cite journal}}: Mirëmbajtja CS1: Datë e përkthyer automatikisht (lidhja)
  37. ^ "HackageDB statistics" (në anglisht). Hackage.haskell.org. Arkivuar nga origjinali më 3 maj 2013. Marrë më 26 qershor 2013.{{cite web}}: Mirëmbajtja CS1: Datë e përkthyer automatikisht (lidhja)
  38. ^ "The LLVM Backend". GHC Trac (në anglisht). 29 mars 2019.{{cite web}}: Mirëmbajtja CS1: Datë e përkthyer automatikisht (lidhja)
  39. ^ Agda 2 (në english), Agda Github Community, 2021-10-15, marrë më 2021-10-16{{citation}}: Mirëmbajtja CS1: Gjuhë e panjohur (lidhja)
  40. ^ "The Haskell Cabal" (në anglisht). Marrë më 8 prill 2015.{{cite web}}: Mirëmbajtja CS1: Datë e përkthyer automatikisht (lidhja)
  41. ^ "Linspire/Freespire Core OS Team and Haskell". Debian Haskell mailing list (në anglisht). maj 2006. Arkivuar nga origjinali më 27 dhjetor 2017. Marrë më 14 qershor 2006.{{cite web}}: Mirëmbajtja CS1: Datë e përkthyer automatikisht (lidhja)
  42. ^ "Live code with Tidal Cycles". Tidal Cycles (në anglisht). Marrë më 2022-01-19.
  43. ^ "Gargantext – Main" (në anglisht). 13 korrik 2023.{{cite web}}: Mirëmbajtja CS1: Datë e përkthyer automatikisht (lidhja)
  44. ^ David, Chavalarias (8 maj 2023). Toward a Research Agenda on Digital Media and Humanity Well-Being (Tezë) (në anglisht).{{cite thesis}}: Mirëmbajtja CS1: Datë e përkthyer automatikisht (lidhja)
  45. ^ "Fighting spam with Haskell". Facebook Code (në anglishte amerikane). 26 qershor 2015. Marrë më 11 gusht 2019.{{cite web}}: Mirëmbajtja CS1: Datë e përkthyer automatikisht (lidhja)
  46. ^ "Open-sourcing Haxl, a library for Haskell". Facebook Code (në anglishte amerikane). 10 qershor 2014. Marrë më 11 gusht 2019.{{cite web}}: Mirëmbajtja CS1: Datë e përkthyer automatikisht (lidhja)
  47. ^ "input-output-hk/cardano-node: The core component that is used to participate in a Cardano decentralised blockchain" (në anglisht). GitHub. Marrë më 2022-03-18.
  48. ^ Parsing, analyzing, and comparing source code across many languages: github/semantic (në anglisht), GitHub, 7 qershor 2019, marrë më 7 qershor 2019{{citation}}: Mirëmbajtja CS1: Datë e përkthyer automatikisht (lidhja)
  49. ^ "Commercial Users of Functional Programming Workshop Report" (PDF) (në anglisht). Marrë më 10 qershor 2022.{{cite web}}: Mirëmbajtja CS1: Datë e përkthyer automatikisht (lidhja)
  50. ^ a b c Gabim referencash: Etiketë <ref> e pavlefshme; asnjë tekst nuk u dha për refs e quajtura klein-sosp09
  51. ^ "Tikhon Jelvis: Haskell at Target". YouTube (në anglisht). 22 prill 2017.{{cite web}}: Mirëmbajtja CS1: Datë e përkthyer automatikisht (lidhja)
  52. ^ "Why Co–Star uses Haskell". Co–Star (në anglisht). Marrë më 30 shtator 2023.{{cite web}}: Mirëmbajtja CS1: Datë e përkthyer automatikisht (lidhja)
  53. ^ "Haskell in Production: Mercury". Serokell (në anglisht). Marrë më 2024-10-11.
  54. ^ "Web/Frameworks – HaskellWiki". wiki.haskell.org (në anglisht). Marrë më 17 shtator 2022.{{cite web}}: Mirëmbajtja CS1: Datë e përkthyer automatikisht (lidhja)
  55. ^ [lidhje e vdekur]Simon Peyton Jones.
  56. ^ "Lazy evaluation can lead to excellent performance, such as in The Computer Language Benchmarks Game" (në anglisht). 27 qershor 2006.{{cite web}}: Mirëmbajtja CS1: Datë e përkthyer automatikisht (lidhja)
  57. ^ Heeren, Bastiaan; Leijen, Daan; van IJzendoorn, Arjan (2003). "Helium, for learning Haskell" (PDF). Proceedings of the 2003 ACM SIGPLAN workshop on Haskell (në anglisht). fq. 62–71. doi:10.1145/871895.871902. ISBN 1-58113-758-3.
  58. ^ "Helium Compiler Docs" (në anglisht). GitHub. Marrë më 9 qershor 2023.{{cite web}}: Mirëmbajtja CS1: Datë e përkthyer automatikisht (lidhja)
  59. ^ "DDC – HaskellWiki" (në anglisht). Haskell.org. 3 dhjetor 2010. Marrë më 26 qershor 2013.{{cite web}}: Mirëmbajtja CS1: Datë e përkthyer automatikisht (lidhja)
  60. ^ Robert Harper (25 prill 2011). "The point of laziness" (në anglisht).{{cite web}}: Mirëmbajtja CS1: Datë e përkthyer automatikisht (lidhja)
  61. ^ Robert Harper (16 prill 2011). "Modules matter most" (në anglisht).{{cite web}}: Mirëmbajtja CS1: Datë e përkthyer automatikisht (lidhja)
  62. ^ "Solving Cabal Hell". www.yesodweb.com (në anglisht). Marrë më 11 gusht 2019.{{cite web}}: Mirëmbajtja CS1: Datë e përkthyer automatikisht (lidhja)
  63. ^ "Announcing cabal new-build: Nix-style local builds" (në anglisht). Marrë më 1 tetor 2019.{{cite web}}: Mirëmbajtja CS1: Datë e përkthyer automatikisht (lidhja)
  64. ^ "Hackathon – HaskellWiki" (në anglisht).

Bibliografia

Redakto
Raportet
Tekstet
Tutoriale
Historia