Haskel (programski jezik)
Haskell | |
---|---|
![]() | |
Originalni naziv | engl. Haskell |
Izgovara se | Haskel |
Model | funkcionalni |
Pojavio se | 1990. |
Dizajner(i) | Lennart 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 |
Aktuelna verzija | R7RS (ratifikovan standard) |
Datum aktuelne verzije | 2010 |
Sistem tipova | statički |
Implementacije | GHC, Hugs, NHC, JHC, Yhc, UHC |
Dijalekti | Helium, Gofer |
Uticaji | Clean,[1] FP,[1] Gofer,[1] Hope and Hope+,[1] Id,[1] ISWIM,[1] KRC,[1] Lisp,[1] Miranda,[1] ML and Standard ML,[1] Orwell, SASL,[1] Scheme,[1] SISAL[1] |
Uticao na | Agda,[2] Bluespec,[3] C++11/Concepts,[4] C#/LINQ,[5][6][7][8] CAL,[traži se izvor] Cayenne,[5] Clean,[5] Clojure,[9] CoffeeScript,[10] Curry,[5] Elm, Epigram,[traži se izvor] Escher,[11] F#,[12] Frege,[13] Hack,[14] Idris,[15] Isabelle,[5] Java/Generics,[5] LiveScript,[16] Mercury,[5] Omega,[traži se izvor] Perl 6,[17] Python,[5][18] Rust,[19] Scala,[5][20] Swift,[21] Timber,[22] Visual Basic 9.0[5][6] |
Operativni sistemi | [multi-platforme] |
Veb-sajt | haskell |
Haskel je standardizovan, funkcionalni, strogo tipiziran programski jezik opšte namjene, sa nestriktnom semantikom. Ime je dobio po logičaru koji se zove Haskell Curry. Posljednji standard Haskela je Haskell 2010, međutim, postoji grupa koja radi na sljedećoj verziji Haskell 2020.
![](http://upload.wikimedia.org/wikipedia/commons/4/43/Haskell-Logo-Variation.png)
Haskel karakterišu sistem tipova sa statičkim tipiziranjem i lijeno izračunavanje. Klase tipova prvi put se pojavljuju u programskom jeziku Haskel. Njegova glavna implementacija je Glasgow Haskell Compiler.
Haskel je zasnovan na semantici, ali ne i na sintaksi programskog jezika Miranda.
Tri su osnovne karakteristike koje ga razdvajaju od programskog jezika ML. Prvo, funkcije u Haskelu mogu biti preopterećene, drugo Haskel koristi nestriktnu semantiku, i treće, Haskel je čist funkcionalni jezik, što znači da u njemu ne postoje izrazi ili naredbe koje imaju bočne efekte.
Nastanak programskog jezika Haskel
Nakon izlaska programskog jezika Miranda 1985.godine, interesovanje za funkcionalne jezike koji podržavaju lijeno izračunavanje je raslo. Do 1987.godine postojalo je više od deset nestriktnih, čistih, funkcionalnih programskih jezika. Od njih, Miranda je svakako bila najviše korišćena, iako je vlasnički softver (ne-slobodan). Na konferenciji FPCA(Functional Programming Languages and Computer Architecture) održanoj 1987.godine u Portlandu u Oregonu, održan je sastanak na kojem su učesnici sklopili sporazum da bi trebalo da se napravi odbor, koji bi definisao otvoreni standard za takve jezike.
Cilj odbora je bio da se postojeći funkcionalni jezici spoje u zajedničku cjelinu, koja bi služila kao osnova za dalja istraživanja u dizajnu funkcionalnih jezika.
Haskell 1.0 do 1.4
Prva verzija Haskela, imenovana sa Haskell 1.0, definisana je 1990. godine. Napori komiteta rezultovali su nizom definicija jezika (1.0, 1.1, 1.2, 1.3, 1.4).
Haskell 98
Tokom 1997. godine niz standarda je dostigao svoj vrhunac kao Haskell 98, sa namjerom da odredi stabilnu, minimalnu, portabilnu verziju jezika propraćenu standardnom bibliotekom za učenje koja bi bila baza za buduće ekstenzije. Komitet je odmah prihvatio kreaciju standarda Haskell 98 sa dodatim eksperimentalnim karakteristikama.
U februaru 1999.godine standard Haskell 98 je formalno objavljen kao "Haskell 98 report". U januaru 2003.godine prerađena verzija je objavljena pod nazivom "Haskell 98 Language and Libraries: The Revised Report". Dalje, jezik nastavlja ubrzano da napreduje,dok sa GHC implementacijom danas predstavlja de facto standard.
Haskell 2010
Početkom 2006.godine, počeo je proces traženja nasljednika standardu Haskell 98, nazvan Haskell Prime. To je trebalo da bude konstantan i postepen proces revidiranja definicija jezika, sa predstavljanjem nove revizije jednom godišnje. Prva revizija, imenovana kao Haskell 2010, najavljena je u novembru 2009. a objavljena u junu 2010. godine.
Haskell 2010 dodaje interfejs stranih funkcija (FFI) dozvoljavajući veze ka drugim programskim jezicima. Takođe, popravljeni su neki sintaksni problemi (promjene u formalnoj gramatici) i zabranjeni su takozvani "n+k šabloni", tj. definicije funkcija poput fact(n+1)=(n+1)*fact n nisu više dozvoljene.
Pored ovoga, dodate su neke ekstenzije poput DoAndIfThenElse, HierarhicalModules, FixityResolution, ForeignFunctionInterface, PatternGuards, NoNPlusKPatterns, itd.
Opis jezika
Haskel karakterišu lijeno izračunavanje, uparivanje šablona, tehnika zadavanja listi, klase tipova i polimorfizam tipova. Haskel je čist programski jezik, što znači da funkcije u njemu nemaju sporedne (bočne) efekte. Postoji poseban konstrukt jezika kojim se reprezentuju sporedni efekti.
Haskel je strogo i statički tipiziran programski jezik, čiji se sistem tipova bazira na Hindley-Milner sistemu tipova. Inovacija Haskela u ovoj oblasti je dodavanje klasa tipova, koje su prvobitno nastale kako bi se omogućilo preopterećivanje (overloading), ali su pronašle još mnoge upotrebe.
Konstrukt jezika kojim su obezbijeđeni sporedni efekti je primjer monade. Generalno, monade su opšta struktura koja može modelovati razne oblike izračunavanja, uključujući obradu grešaka, nedeterminizam, sintaksnu analizu itd. Monade su definisane kao obični tipovi podataka, ali Haskel obezbjeđuje sintaksne olakšice pri njihovom korišćenju. Dakle, monade uključuju skup programskih tehnika višeg reda koje se mogu korisiti da zamijene eksplicitno stanje u mnogim slučajevima, ali njihova primjena obuhvata i mnogo više od samog simuliranja stanja.
Jezik ima otvorenu, javnu specifikaciju i postoje mnoge implementacije. Glavna implementacija Haskela, GHC, je istovremeno i interpretator i kompilator koji radi na mnogim platformama. GHC se izdvaja po efikasnoj implementaciji koja koristi konkurentnost i paralelizam, kao i po bogatom sistemu tipova koji inkorporira inovacije poput familija tipova i konstruktora za tipove podataka.
Primjeri kodova u Haskelu
Slijedi Zdravo svijete program, napisan u Haskelu, pri čemu sve osim posljednje linije može biti izostavljeno.
module Main where main :: IO () main = putStrLn "Zdravo, svijete!"
Sljedeći primjer je funkcija u Haskelu koja izračunava faktorijel broja pomoću uparivanja šablona:
fact 0 = 1 fact 1 = 1 fact n = n * fact (n-1)
U Haskelu ne postoji rezervisana (ključna) riječ kojom bi započinjala definicija funkcije.
Jos jedan primjer funkcije koja izračunava faktorijel broja dat je sa:
factorial :: Int -> Int factorial 0 = 1 factorial n | n > 0 = n * factorial (n-1)
Prva linija je potpis funkcije i ona specificira da je factorial funkcija koja očekuje argument tipa Int i vraća rezultat tipa Int. U Haskelu je prisutno statičko tipiziranje, tačnije, kompajler je u stanju da automatski zaključi potpise, za skoro sve funkcije. Ovo se događa čak i kad je potpis funkcije naveden, u tom slučaju kompajler provjerava da li je potpis tačan. Potpisi funkcija su dio korisne dokumentacije.
Naredne dvije linije su kod za factorial. U Haskelu, definicija funkcije se može sastojati od više jednačina. Da bi se funkcija primijenila na argument koristi se uparivanje šablona: ispituju se jednačine jedna po jedna, od vrha prema dnu, dok se ne pronađe prva čiji šablon odgovara argumentu. Prva linija faktorijela uparuje samo 0, u ovom slučaju odgovor je automatski 1. Ako je argument ne-nula pokušava se sa uparivanjem druge jednačine. Ova jednačina ima bulovski uslov koji mora biti True, tj.tačan da bi uparivanje bilo uspješno. Druga jednačina uparuje sve argumente koji su veći od 0, i u tom slučaju izračunava se faktorijel broja n izrazom n * factorial (n-1). Ukoliko se funkcija factorial primijeni na negativan argument nijedna od jednačina ne može biti uparena, i program će izbaciti run-time grešku.
U nastavku je funkcija factorial definisana pomoću funkcija višeg reda foldl i foldr, koje se nalaze u biblioteci Haskela.
factorial n = foldl (*) 1 [1..n] factorial = foldr (*) 1 . enumFromTo 1
Implementacija pomoću funkcije foldl zasniva se na implementaciji funkcije product, dok definicija korišćenjem funkcije foldr ilustrije definisanje funkcije bez navođenja njenog agrumenta, i korišćenjem notacije sa tačkom, koja označava kompoziciju funkcija.
Sljedeća funkcija, koja takođe koristi uparivanje šablona, izračunava n-ti član Fibonačijevog niza.
fib 0 = 1 fib 1 = 1 fib (n+2) = fib (n+1) + fib n
Definicija faktorijela koja koristi ograđene jednačine (guarded expressions).
fact n = | n==0 = 1 | n==1 = 1 | n>1 = n * fact (n-1)
Njima se specificiraju uslovi pod kojima definicija funkcije može biti primijenjena. Ova definicija faktorijela je preciznija od prethodne, jer je izvršena restrikcija njenog parametra na one vrijednosti za koje funkcija radi. Ovakva forma definicije funkcije naziva se kondicionalni izraz, po matematičkom izrazu na kome je zasnovana.
Može se pojaviti otherwise kao posljednji uslov u kondicionalnom izrazu sa očiglednom semantikom. Na primjer,
sub n | n < 10 = 0 | n > 100 = 2 | otherwise = 1
Funkcija
square x = x * x
koja vraća kvadrat zadatog broja može da primi argument koji je bilo kog numeričkog tipa, pošto Haskel podržava polimorfizam.
Još neke implementacije funkcija za izračunavanje Fibonačijevih brojeva date su u nastavku.
fib n = fibs !! n where fibs = 0 : 1 : zipWith (+) fibs (tail fibs) fib n = fibs (0,1) !! n where fibs (a,b) = a : fibs (b,a+b)
Liste u Haskelu se pišu u zagradama, na primjer:
boje = ["plava", "zelena", "crvena", "zuta"]
Haskel uključuje kolekciju operatora nad listama. Na primjer, liste se mogu nadovezivati sa ++, : služi za odvajanje glave i repa liste, i .. se koristi da se specificira aritmetička serija u listi.
Na primjer, 5: [2,7,9] kao rezultat daje [5,2,7,9], [1,3..11] kao rezultat daje [1,3,5,7,9,11], dok [1,3,5] ++ [2,4,6] kao rezultat daje [1,3,5,2,4,6]
Korišćenjem operatora : i uparivanja šablona može se definisati funkcija koja računa proizvod zadate liste brojeva:
product [] = 1 product (a:x) = a * product x
Koristeći upravo definisanu funkciju product može se definisati funkcija koja računa faktorijel broja.
fact n = product [1..n]
Haskelova tehnika zadavanja listi omogućava da se lista kubova svih brojeva između 1 i 50 definiše sa:
[n*n*n|n<-[1..50]]
Gornji izraz se može pročitati kao: lista svih n*n*n tako da je n u rangu od 1 do 50. U ovom slučaju kvalifikator ima formu generatora i on generiše brojeve od 1 do 50. U ostalim slučajevima, kvalifikatori su u obliku Bulovskih izraza i u tim slučajevima se oni nazivaju testovima.
Ova notacija se može iskoristiti za opisivanje algoritama koji rade razne stvari, kao što su nalaženje permutacija liste i sortiranje listi.
Na primjer, sljedeća funkcija factors za dato n vraća listu svih njegovih djelilaca (faktora).
factors n = [i| i<-[1..n `div` 2], n `mod` i == 0]
Lista kojom je zadata funkcija kreira listu brojeva koji su u rangu od 1 do n/2 i takvi da dijele n.
Ovo je veoma egzaktna i kratka definicija djelilaca datog broja.
Apostrofi koji okružuju operatore div i mod su iskorišćeni da se naglasi infiksna upotreba ovih operatora. Kada se oni pozivaju u funkcijskoj notaciji, kao u: div n 2, onda se apostrofi ne koriste.
Koncizna definicija algoritma kviksort (quicksort) u Haskelu data je sa:
quicksort [] = [] quicksort (h:t) = quicksort [b| b<-t, b<=h] ++ [h] ++ quicksort [b| b<-t, b>h]
U ovoj funkciji, skup elemenata liste koji su manji ili jednaki od glave liste je sortiran i na njega je nadovezana glava liste, a zatim je skup elemenata koji su veći od glave liste soritan i nadovezan na prethodni rezultat. Ova definicija kviksort algoritama je značajno kraća i jednostavnija od koda istog algoritma u nekom imperativnom jeziku.
Haskel program sastoji se od jednog izraza, a taj izraz može sadržati razne podizraze. Pitanje je, u kom će redosljedu ce oni biti izračunati? Haskel je nestriktan jezik, tako da, nijedan od izraza ne bi trebalo da bude izračunat, prije nego što njegov rezultat ne bude neophodan. Intuitivno, trebalo bi prvo izvršiti redukciju najlijevljeg izraza, sve dok je funkcija, zamjenjivati argumente u tijelo funkcije, ali ne izračunavajući ih, i onda izvršiti redukciju rezultujućeg izraza.
Ovakav poredak izračunavanja naziva se normalni poredak.
(if n>=0 then factorial else error) (factorial (factorial n))
U primjeru iznad, if then else naredba koristi n da bi se odlučilo koju funkciju, factorial ili error primijeniti na argument (factorial (factorial n)). Nema smisla izračunavati argument sve dok se ne evaluira if then else naredba. Kad se ona evaluira, može se zamijeniti (factorial (factorial n)) u tijelo factorial ili error funkcije i nastaviti sa izračunavanjem.
Dakle, preciznije, ukoliko se izraz zamisli kao stablo, Haskel prvo izračunava, tj.redukuje najlijevlji izraz, sve dok se ne dođe do konstruktora ili funkcije. Ako se došlo do konstruktora izračunavanje je završeno. Bilo koji preostali podizrazi ostaju neizračunati. Ako se došlo do funkcije koja nije primijenjena ni na kakve argumente, onda je izračunavanje zavšeno. Inače, redukcijama se došlo do funkcije i ona je primijenjena na argumente. Tada se funkcija primijeni na prvi argument, koji se pri tom ne izračunava, već se samo zamjenjuje u tijelo funkcije i nastavlja se sa izračunavanjima.
Ugrađene funkcije kao što su sabiranje i uparivanje šablona zahtijevaju da njihovi argumenti budu evaluirani prije nego što se počne sa evaliranjem tih funkcija. Za deklarativne programe, ovakav način izračunavanja, kada se uvijek redukuje najlijevlji izraz naziva se normalni poredek, i ima osobinu da se uvijek završava, ako se izračunavanje može završiti.
Kako argumenti funkcija nisu automatski evaluirani prije poziva funckije, funkcije u Haskelu nazivamo nestriktnim. Iako nije komandovano Haskell jezikom, mnoge implementacije Haskela podržavaju lijeno izračunavanje, čime se osigurava da se izrazi izračunavaju najviše jednom. Optimizacija Haskel kompajlera vrši se primjenom analize koja se naziva [[analiza striktnosti]] strictness analysis da bi se odlučilo kada lijeno izračunavanje nije neophodno za terminiranje ili kontrolu resursa. Funkcije kojima nije potrebno lijeno izračunavanje se kompajliraju kao striktne funkcije, što je mnogo efikasnije.
Nestriktni jezici imaju nekoliko prednosti u odnosu na striktne programske jezike. Prvo, generalno su efikasniji, jer se neka izračunavanja izbjegavaju. Drugo, neki interestantni koncepti su mogući sa nestriktnim jezicima koji nisu mogući sa striktnim. Među njima su beskonačne liste. Kako se izrazi izračunavaju samo ukoliko su njihove vrijednosti neophodne, to ima za posljedicu mogućnost definisanja beskonačnih struktura podataka. Na primjer:
positives = [0..] evens = [2,4..] squares = [n*n | n <- [0..]]
Naravno, ne postoji računar koji će stvarno reprezentovati sve elemente ovih listi, ali to ne sprječava njihovo korišćenje, ako je podržano lijeno izračunavanje.
Na primjer, ukoliko se želi provjera da li je određeni broj kvadrat nekog broja, provjerila bi se listu squares sa funkcijom pripadanja listi. Uz pretpostavku da postoji predikatska funkciju koja se naziva member i koja određuje da li je dati element sadržan u datoj listi, ovo bi se moglo iskoristiti sa:
member 16 squares
i ovaj izraz bi vratio vrijednost True. Elementi liste squares bi se izračunavali sve dok broj 16 ne bude pronađen. Međutim, funkcija member bi morala biti pažljivo definisana.
member b [] = False member b (a:x)=(a==b) || member b x
Druga linija definicije razdvoji listu na njenu glavu i rep i vraća vrijednost True ako je ili glava jednaka elementu koji se traži (b) ili ako rekurzivni poziv za rep liste vrati vrijednost True.
Ova definicija member funkcije bi radila ispravno samo ako bi dati broj zaista bio kvadrat nekog broja.
Ako to nije slučaj, elemenati liste squares bi se generisali zauvijek, ili dok se ne bi prekoračilo neko memorijsko ograničenje. Naredna funkcije obezbjeđuje provjeru da li dati element pripada soritanoj listi, prekidajući pretragu i vraćajući False ako se sa pretragom došlo do broja koji je veći od broja koji se traži.
member2 n (m:x) | m < n = member2 n x | m == n = True | otherwise = False
Currying
Iz pravila redukcije u lambda računu (lambda calculus) može se uočiti da se primjena funkcija koja očekuje više argumenata, na primjer n argumenata, izračunava tako što se primijeni na svoj prvi argument, a kao povratna vrijednost dobija se funkcija sa n-1-im argumentom. Ovaj proces se naziva currying. Može se napisati funkcija koja duplira svaki elemet liste pozivajući funkciju map sa samo jednim argumentom:
doubleList = map (\x -> 2*x)
Notacija \x -> 2*x je Haskelova notacija za anonimne funkcije, koje su lambda izrazi. Primjena funkcije doubleList izgledala bi: doubleList [1,2,3,4] => map (\x -> 2*x) [1,2,3,4] => [2,4,6,8]
Polimorfni tipovi
U Haskelu se izrazi statički tipiziraju. Međutim, programeri nisu ograničeni na Haskelove predefinisane tipove.
U program se mogu uključiti potpuno novi tipovi. Na primjer, može se uključiti novi tip BinTree za binarna stabla:
data BinTree a = Empty | Node a (BinTree a) (BinTree a)
BinTree je ili Empty, što prestavlja prazno stablo, ili Node, tj.čvor koji sadrži jedan element i dva podstabla. Empty i Node se nazivaju konstruktori i oni kreiraju strukturu podataka tipa BinTree. U definiciji, a je tipska promjenljiva, i predstavlja tip elemenata koji se nalaze u stablu. BinTree Integer je tada tip binarnih stabala koja sadrže cijele brojeve. Element u čvoru Node i elementi u podstablima su ograničeni na iste tipove. Sljedeća funkcija vraća broj elemenata u binarnom stablu.
size:: BinTree a -> Integer size Empty = 0 size (Node val lt rt) = 1 + (size lt) + (size rt)
Prva linija je potpis funckije. Može se pročititi kao: "Za sve tipove a, size uzima jedan argument tipa BinTree i vraća jedan Integer". Pošto size radi za stabla koja sadrže elemenate proizvoljnog tipa, ova funckija naziva se polimorfna funckija.
Kod funkcije sastoji se od dvije linije od kojih prva uparuje prazna stabla, i njihova veličina je 0, a druga uparuje neprazna stabla i njihova veličina je zbir veličina lijevog i desnog podstabla uvećan za jedan.
Sljedeća funkcija je lookup funkcija koja nalazi (ako postoji) element u binarnom stablu pretrage. Stablo sadrži elemente tipa tuple(u ovom slučaju uređeni par, u opšem slučaju uređena n-torka) koji imaju cijeli broj koji je ključ i string koji je vrijednost, tj.tip ovih stabala je: BinTree (Integer, String). Funkcija lookup vraća vrijednost tipa Maybe String,a ta vrijednost je Nothing,ako ključ ne postoji u stablu, ili Just val, ako je uređeni par oblika (k, val) u stablu. Tip Maybe a je ugrađeni, polimorfni tip.
lookup :: Integer -> BinTree (Integer,String) -> Maybe String lookup k Empty = Nothing lookup k (Node (nk,nv) lt rt) | k == nk = Just nv lookup k (Node (nk,nv) lt rt) | k < nk = lookup k lt lookup k (Node (nk,nv) lt rt) | k > nk = lookup k rt
Na prvi pogled, potpis funkcije može djelovati neobično, zbog znaka -> između Integer i BinTree argumenta. Međutim, to je zbog pravila currying.
Kada se lookup primijeni na ključ koji je tipa Integer, kao povratna vrijednost dobije se nova funkcija koja kad se primijeni na binarno stablo uvijek traži isti ključ.
Klase tipova
Nedostatak gornje definicije funkcije lookup je što je dati tip veoma restriktivan. Da li se ova funkcija može učiniti polimorfnom kao funkcija size? Tada bi se isti kod mogao iskoristiti za pretragu stabala koja sadrže skoro pa proizvoljan tip podataka, tačnije, tip koji omogućava primjenu operatora ==, < i >. Da bi se ovo omogućilo Haskel ima tipove klasa koji daju ima grupi funkcija. Ako tip omogućava primjenu tih funkcija, onda za taj tip kažemo da pripada toj klasi tipova. U Haskelu postoji ugradjeni kasni tip Ord koji podržava ==, < i >. Naredni potpis specificira da tip ključa u stablu mora biti tip klase Ord.
lookup :: (Ord a) => a -> BinTree (a,b) -> Maybe b
Klase tipova omogućavaju da imena funkcija budu preopterećena(overloaded).
Operator < za Integer nije isti kao operator < za String. Međutim, kako Haskel kompajler zna tipove svih izraza, može zamijeniti odgovarajući operator. Programeri mogu dodavati sopstvene tipove i klase tipova. Na primjer, tip BinTree bi se mogao dodati u Ord, obezbjeđivanjem odgovarajućih definicija za operatore poređenja. Takođe, ukoliko bi se kreirao tip kompleksnih brojeva, on bi se mogao dodati klasi numeričkih tipova koja se naziva Num, a naravno pri tome bi se morali obezbijediti svi operatori iz te klase i nad kompleksnim brojevima. Najopštija deklaracija funkcije factorial je:
factorial :: (Num a, Ord a) => a -> a
Na taj način, obezbijeđeno je da se funkcija factorial može primijeniti na argumenat bilo kog tipa koji podržava aritmetičke operatore i operatore poređenja, vraćajući pri tome vrijednost istog tipa.
Haskell 2010
GHC
GHC je optimizovani kompajler za Haskel koji obezbjeđuje mnoge jezičke ekstenzije. Sam kompajler napisan je u programskom jeziku Haskel (plus ekstenzije) i njegova veličina i kompleksnost imaju za posljedicu da ima slabiju portabilnost od Hugs-a, da je sporiji i zahtijeva više memorije. Ipak, programi napisani u njemu se mnogo brže izvršavaju.
Takođe, postoji interaktivno okruženje GHCi, slično Hugs-u, ali podržava interaktivno učitavanje kompajliranog koda. GHC podržava konkurentno i paralelno programiranje. Dostupan je na svim većim platformama, uključujući Windows, Mac OS X, kao i neke varijatne Unixa (Linux, *BSD, Solaris).
GHC tim preporučuje instaliranje Haskel platforme za GHC. Još jedna povoljna opcija za Windows korisnike je MinGHC.
UHC
UHC (Utrecht Haskell Compiler) je implementacija Haskela od stane unverziteta Utrecht. UHC podržava skoro sve karakteristike Haskell 98 i Haskell 2010 kao i dodatne, eksperimentalne ekstenzije.
Kompajler radi na platformama Mac OS X, Windows (Cygwin) i raznim Unix platformama.
UHC je implementiran koristeći atributivnu gramatiku i pogodan je za eksperimentisanje sa jezičkim ekstenzijama. 18. aprila 2009. UHC je najavljen na petom Haskel Hakatonu u Utrehtu.
Haskell 98
Jhc
Jhc je eksperimentalni kompajler sa ciljem testiranja novih metoda optimizacija i istraživanja dizajna prostora implementacija Haskela.
Helium
Helium je funkcionalni programski jezik i kompajler dizajniran specijalno za učenje Haskela.
Kvalitet error poruka je glavni problem pri izboru osobina jezika, kao i u implementaciji kompajlera. Ovaj jezik je podskup Haskela. Najveća razlika među njima ogleda se u nepostojanju preopterećivanja. Jezik prati brojne informacije o programu radi davanja dobrih informativnih poruka.
Neodržavane
Naredne implementacije nisu više aktivno održavane.
Hugs
Hugs je mali, bajtkod interpretator napisan u programskom jeziku C koji može da se pokrene sa skoro svake platforme.
Najbolja upotreba je pri razvoju Haskel programa. Prednost je jako brza interpretacija izvornog koda, kao i pogodnost interaktivnog interpretatora (u kojem je moguće kretanje između modula radi testiranja odvojenih delova programa).
Ipak, kako je to interpretator, ne može se ni porediti sa brzinom izvršavanja programa pri kompajliranju, korišćenjem GHC-a i drugih Haskel kompajlera. Hugs 98 je pogodan za verziju Haskell 98.
Dostupan je na svim Unix platformama uključujući i Linux, kao i DOS, Windows 3.x, Win 32 i Macintosh. Postoji dosta bogata biblioteka, uključuući Win32 biblioteke, a Windows verzija koristi grafički korisnički interfejs WinHugs.
nhc98
nhc98 je još jedan bajtkod kompajler. Fokusira se na minimizovanju memorijskog prostora.
Primjene
Darcs je sistem za upravljanje izvornim kodom napisan u Haskelu, sa pojedinim inovativnim karakteristikama. Cabal je alat za pravljenje i paketiranje Haskel biblioteka i programiranje. GHC je često korišćen za testiranje naprednih osobina funkcionalnog programiranja i optimizacije drugih programskih jezika.
Industrija
- Facebook implementira svoje anti-spam programe u Haskelu, kao open-source softver.
- Cryptol jezik i lanac za razvoj i verifikaciju kriptografskih algoritama je implementiran u Haskelu.
Veb
Postoje Haskel okviri veb priloga poput:
- Yesod
- Happstack
- Snap
Reference
- ^ а б в г д ђ е ж з и ј к л Peyton Jones 2003, стр. xi harvnb грешка: no target: CITEREFPeyton_Jones2003 (help)
- ^ Norell, Ulf (2008). „Dependently Typed Programming in Agda” (PDF). Gothenburg: Chalmers University. Pristupljeno 9. 2. 2012.
- ^ Hudak et al. 2007, стр. 12-38,43. sfn грешка: no target: CITEREFHudakHughesPeyton_JonesWadler2007 (help)
- ^ Stroustrup, Bjarne; Sutton, Andrew (2011). „Design of Concept Libraries for C++” (PDF). Архивирано из оригинала (PDF) 10. 02. 2012. г. Приступљено 18. 04. 2016.
- ^ а б в г д ђ е ж з и Hudak et al. 2007, стр. 12–45–46. sfn грешка: no target: CITEREFHudakHughesPeyton_JonesWadler2007 (help)
- ^ а б Meijer, Erik. „Confessions of a Used Programming Language Salesman: Getting the Masses Hooked on Haskell”. OOPSLA 2007.
- ^ Meijer, Erik (1. 10. 2009). „C9 Lectures: Dr. Erik Meijer – Functional Programming Fundamentals, Chapter 1 of 13”. Channel 9. Microsoft. Pristupljeno 9. 2. 2012.
- ^ Drobi, Sadek (4. 3. 2009). „Erik Meijer on LINQ”. InfoQ. QCon SF 2008: C4Media Inc. Приступљено 9. 2. 2012.
- ^ Hickey, Rich. „Clojure Bookshelf”. Listmania!. Amazon.com. Pristupljeno 9. 2. 2012.
- ^ Heller, Martin (18. 10. 2011). „Turn up your nose at Dart and smell the CoffeeScript”. JavaWorld. InfoWorld. Архивирано из оригинала 10. 02. 2012. г. Приступљено 9. 2. 2012.
- ^ „Declarative programming in Escher” (PDF). Pristupljeno 7. 10. 2015.
- ^ Syme, Granicz & Cisternino 2007, стр. 2
- ^ Wechsung, Ingo. „The Frege Programming Language” (PDF). Pristupljeno 26. 2. 2014.
- ^ „Facebook Introduces 'Hack,' the Programming Language of the Future”. WIRED. 2014.
- ^ „Idris, a dependently typed language”. Pristupljeno 26. 10. 2014.
- ^ „LiveScript Inspiration”. Pristupljeno 4. 2. 2014.
- ^ „Glossary of Terms and Jargon”. Perl Foundation Perl 6 Wiki. The Perl Foundation. Pristupljeno 9. 2. 2012.
- ^ Kuchling, A. M. „Functional Programming HOWTO”. Python v2.7.2 documentation. Python Software Foundation. Pristupljeno 9. 2. 2012.
- ^ „The Rust Reference: Appendix: Influences”. Arhivirano iz originala 19. 4. 2016. g. Pristupljeno 3. 2. 2016.
- ^ Fogus, Michael (2010). „MartinOdersky take(5) toList”. Send More Paramedics. Pristupljeno 9. 2. 2012.
- ^ Lattner, Chris (2014-06-03). „Chris Lattner's Homepage”. Chris Lattner. Pristupljeno 3. 6. 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.«
- ^ „Timber/History”. Pristupljeno 7. 10. 2015.
Literatura
- Syme, Don; Granicz, Adam; Cisternino, Antonio (2007). Expert F#. Apress. str. 2. »F# also draws from Haskell particularly with regard to two advanced language features called sequence expressions and workflows.«
- http://smbidoki.ir/courses/66_Concepts%20of%20Programming%20Languages%2010th-Sebesta.PDF
- https://web.archive.org/web/20130516174246/http://www.epsa.org/forms/uploadFiles/3B6300000000.filename.booksingle.pdf
Spoljašnje veze
![](http://upload.wikimedia.org/wikipedia/commons/thumb/4/4a/Commons-logo.svg/30px-Commons-logo.svg.png)
- Zvanični veb-sajt
- Haskell Wiki
- Planet Haskell an aggregator of Haskell related blogs and other Haskell-related news sites
- Hackage – central package archive
- Hoogle – API search engine
- Tutorials
- Try Haskell! – in-browser interactive tutorial
- School of Haskell Архивирано на сајту Wayback Machine (25. децембар 2015) – online tutorials
- Functors, Applicatives, And Monads In Pictures
- Real World Haskell - free to read online
- Ostalo
- The Monad.Reader – quarterly magazine on Haskell topics
- The Evolution of a Haskell Programmer – slightly humorous overview of different programming styles in Haskell
- p
- r
- u
Kategorija
Spisak