Haskell

**Haskell** (/ˈhæskə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. 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 logjikuesit Haskell Curry. 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. 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, dhe përbëhet nga më pak se 1% e përdoruesve aktivë në depon e kodit burimor GitHub.

## Historia 
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. 

### Haskell 1.0 deri në 1.4 
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.

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. 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.  Përpjekjet e komitetit rezultuan në një sërë përkufizimesh gjuhësore (1.0, 1.1, 1.2, 1.3, 1.4).
djathtas|parapamje| 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 
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. 

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

### Haskell 2010 
Në fillim të vitit 2006, filloi procesi i përcaktimit të një pasardhësi të standardit Haskell 98, i quajtur zyrtarisht *Haskell Prime*. 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 
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ë 
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ë,  por që më pas gjeti shumë përdorime të tjera.

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,  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*.

## Shembuj kodesh 
Një "Përshëndetje, botë!" program në Haskell (vetëm rreshti i fundit është rreptësisht i nevojshëm):
```haskell
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):
```haskell
factorial :: (Integral a) => a -> a

-- Përdorimi i rekruzionit (Me shprehjen "ifthenelse")
factorial n = if n  [a] -> [a]

-- Përdorimi i të kuptuarit e listës
quickSort []   = []                -- Lista boshe është renditur
quickSort (x:xs) = quickSort [a | a = x] -- Rendit pjesën e djathtë të listës

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

## Zbatimet 
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).  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,  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 
* Agda është një asistente provash e shkruar në Haskell.
* Cabal është një mjet për ndërtimin dhe paketimin e bibliotekave dhe programeve Haskell.
* 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.
* 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.
* Xmonad është një menaxher i dritareve për sistemin e dritareve X, i shkruar plotësisht në Haskell.
* GarganText  ë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.

### Industria 
* 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  në Haskell, duke ruajtur bibliotekën themelore të aksesit të të dhënave si softuer me burim të hapur.
* Platforma e blockchain Cardano është implementuar në Haskell.
* GitHub zbatoi Semantic, një bibliotekë me burim të hapur për analizën, ndryshimin dhe interpretimin e kodit burimor të pabesueshëm, në Haskell.
* Gjuha e modelimit financiar të Standard Chartered Mu është Haskell sintaksor që funksionon në një kohë të rreptë ekzekutimi.
* seL4, mikrokerneli i parë i verifikuar zyrtarisht,  përdori Haskell si një gjuhë prototipimi për zhvilluesin e OS.
* Co-Star 
* Pjesa e pasme e Merkurit është shkruar në Haskell.

### Rrjeti 
Kornizat e dukshme të rrjetit të shkruara për Haskell përfshijnë: 

* IHP
* Servant
* Snap
* Yesod

## Kritika 
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ë. Përveç konsideratave  praktike si përmirësimi i performancës, 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."  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.

Ben Lippmeier projektoi Disciple  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.&nbsp;20) se "përditësimi shkatërrues i jep programuesit dy mjete të rëndësishme dhe të fuqishme&nbsp;... 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, dhe "inferioriteti" i sistemit (të vjetër) të klasave të Haskell-it në krahasim me sistemin e moduleve të ML.

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. Vetë Cabal tani ka një sistem ndërtimi shumë më të sofistikuar, të frymëzuar thellësisht nga Nix, i cili u bë i paracaktuar me versionin 3.0.

## Gjuhë të ngjashme 
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 
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.

## Referime 
## Bibliografia 
; Raportet

* 
* 

; Tekstet

* 
* 
* 
* 
*  Real World Haskell (full text).
* 
*  (full text )
* 
* 

; Tutoriale

* 
* Learn You a Haskell for Great Good! - A community version (*learnyouahaskell.github.io)*. An up-to-date community maintained version of the renowned "Learn You a Haskell" (LYAH) guide.
*  Assumes far less prior knowledge than official tutorial.
* 
* 

; Historia

* 
*