Haskell (programovací jazyk)

Haskell je štandardizovaný funkcionálny programovací jazyk s voľnou sémantikou (lenivé vyhodnocovanie) pomenovaný po logikovi Haskellovi Currym. Bol vytvorený v 90. rokoch 20. storočia. Posledným polooficiálnym štandardom je Haskell 98, ktorý definuje minimálnu a portabilnú verziu jazyka využiteľnú na výuku alebo ako základ ďalších rozšírení. Jazyk sa rýchlo vyvíja, predovšetkým vďaka svojim implementáciám Hugs a GHC (pozri nižšie), ktoré predstavujú súčasný de facto štandard.

Medzi zaujímavé vlastnosti jazyka Haskell patrí podpora rekurzívnych funkcií a údajových štruktúr, pattern matching, expanzia zoznamov a strážne výrazy. Takáto kombinácia schopností umožňuje tvorbu funkcií, ktoré by sa v procedurálnych jazykoch implementovali ťažko, zatiaľ, čo v Haskelli sú triviálne. Haskell je v roku 2002 funkcionálny jazyk, na ktorom sa vykonáva najviac výskumu. Bolo vyvinutých niekoľko variantov: paralelizovateľné verzie od MIT a Glasgowskej univerzity, obe sa nazývajú Haskell; paralelnejšie a distribuovanejšie verzie nazývané Distributed Haskell (bývalý Goffin) a Eden; verzia implementujúca špekulatívne vyhodnocovanie nazývaná Eager Haskell a niekoľko objektovo orientovaných verzií: Haskell++, O'Haskell a Mondrian.

Existuje aj jazyk podobný Haskellu, ktorý ponúka nový spôsob podpory vývoja GUI nazývaný Concurrent Clean. Jeho najväčšou odchýlkou od Haskellu je použitie jedinečných typov a monáda.

Mark Jones vyvinul výučbovú verziu jazyka nazývanú Gofer. Bola nahradená systémom HUGS (Haskell User's Gofer System), pozri implementácie dolu.

Príklady 
Definícia funkcie faktoriálu:

 fac 0 = 1
 fac n = n * fac (n - 1)

Iná definícia faktoriálu (používa funkciu product zo štandardnej knižnice Haskellu):

 fac n = product [1..n]

Naivná implementácia funkcie vracajúcej n-tý prvok Fibonacciho postupnosti:

 fib 0 = 0 
 fib 1 = 1 
 fib n = fib (n - 2) + fib (n - 1)

Funkcia vracajúca čísla Fibonacciho postupnosti s lineárnou výpočtovou zložitosťou.

 fibs@(_:rest) = 0 : 1 : (zipWith (+) fibs rest)

Predchádzajúca funkcia vytvorí nekonečný zoznam, čo je možné vďaka lenivému vyhodnocovaniu. Je možné ho implementovať ako 

 fib n = fibs !! n

(!! je operátor, ktorý vráti n-tý prvok zoznamu).

Elegantný zápis triediaceho algoritmu quicksort:

 qsort [] = []
 qsort (pivot:tail) = 
   qsort left ++ [pivot] ++ qsort right
   where
     left = [y | y <- tail, y < pivot]
     right = [y | y <- tail, y >= pivot]

Implementácie 
Nasledujúce implementácie celkom (alebo takmer celkom) vyhovujú štandardu Haskell 98 a sú distribuované pod open source licenciou. V súčasnosti neexistujú komerčné implementácie.
 Hugs je interpreter bajtkódu. Ponúka rýchly preklad programov a znesiteľnú rýchlosť spúšťania. Je vhodný predovšetkým na výučbové účely.
 Glasgow Haskell Compiler kompiluje do natívneho kódu niekoľkých rôznych počítačových architektúr a do jazyka C. GHC je pravdepodobne najpopulárnejšia implementácia a existuje preň pomerne veľké množstvo užitočných knižníc (napr. väzby na OpenGL).
 nhc98 je ďalším kompilátor bajtkódu, ale jeho programy bežia výrazne rýchlejšie ako s HUGS. Nhc98 sa zameriava na minimalizáciu použitia pamäte a preto je ideálny na použitie na starších počítačoch.
 HBC je ďalší kompilátor natívneho kódu. Jeho vývoj pred dlhším časom ustal, ale je stále použiteľný.
 Helium novším dialektom Haskellu. Zameriava sa na jednoduché naučenie. Momentálne mu chýbajú typové triedy, čo ho robí nekompatibilným s mnohými programami v Haskelle.

Rozšírenia 
 O'Haskell je rozšírenie Haskellu, pridáva objektovo orientované vlastnosti a podporu pre konkurentné programovanie.

Externé zdroje 

 Domovská stránka Haskellu 
 Haskell Wiki  
 Jemný úvod do Haskell 98  (pdf formát)
 Evolúcia programátora Haskellu  (jemne humorný prehľad rozličných štýlov programovania dostupných v Haskelle)
 Online Bibliografia výskumu Haskellu  
 Humor Haskellu  

Programovacie jazyky
Funkcionálne jazyky