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:


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


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


```haskell
fac n = product [1..n]
```


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


```haskell
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.


```haskell
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 


```haskell
fib n = fibs !! n
```


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

Elegantný zápis triediaceho algoritmu quicksort:


```haskell
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é odkazy

* 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  

Kategória:Programovacie jazyky
Kategória:Funkcionálne jazyky
Kategória:Eponymické termíny v informatike