Haskell (programovací jazyk)
Author
Albert FloresHaskell je standardizovaný funkcionální programovací jazyk používající líné vyhodnocování, pojmenovaný na počest logika Haskella Curryho. Jazyk se rychle vyvíjí, především díky svým implementacím Hugs a GHC.
Haskell je jazyk dodržující referenční transparentnost. To, zjednodušeně řečeno, znamená, že tentýž (pod)výraz má na jakémkoliv místě v programu stejnou hodnotu. +more Mezi další vlastnosti tohoto jazyka patří přísné typování proměnných, které programátorovi může usnadnit odhalování chyb v programu. Haskell plně podporuje práci se soubory i standardními vstupy a výstupy.
Historie
Jazyk byl navržen na konci 80. let +more_století'>20. století skupinou vědců, kteří se snažili vytvořit otevřený standard funkcionálního programovacího jazyka s moderními vlastnostmi. Dále byl v 90. letech 20. století rozvíjen, hlavně v akademické sféře (motto: „avoid success at all costs“, tedy „vyhnout se úspěchu za každou cenu“) a později začal být známější i mimo ni, částečně díky online komunitě. Poslední ustálenou verzí je revize Haskell 98, jež definuje minimální a přenositelný standard jazyka využitelný k výuce nebo jako základ dalších rozšíření. Plánované zařazení některých rozšíření je pojmenováno jako Haskell′ (Haskell Prime).
Historie v širším pojetí
Historie tohoto jazyka sahá až do září roku 1987. Tehdy se konala konference o funkcionálním programování ve státě Oregon. +more První verze tohoto jazyka byla oznámena až v roce 1990 (version 1. 0). Další přišly v srpnu 1991 (version 1. 1), v květnu 1992 (version 1. 2), v květnu 1996 (version 1. 3) a v dubnu 1997 (version1. 4). V roce 1994 registroval John Peterson internetovou doménu haskell. org. Za vrchol je považován Haskell 98, což je také jeho poslední oficiální verze. Je čistě funkcionální na rozdíl od Scheme a je určený pro výzkum.
Jméno nese podle amerického logika (matematika), který se jmenoval Haskell Brooks Curry. Narodil se ve státě Massachusetts 12. +more září 1900 a zemřel 1. září 1982 ve státě Pennsylvania, USA. Tento americký matematik studoval ve dvacátých letech dvacátého století na Harvardu. Zabýval se kombinační logikou a dal základy k funkcionálnímu programování. Proto nese také jeho název. V letech 1944-1945 pracoval v laboratořích na Johns Hopkins University. Začal se zabývat ENIAC (Electronic Numerical Integrator and Computer) - předchůdcem dnešních počítačů. V roce 1946 o tom napsal studie týkající se interpolací. V roce 1966 přijímá pozici profesora logiky v Amsterdamu. Zde stráví čtyři roky a poté se vrací na State College, kde také později umírá.
Datové typy
Čísla
Čísla se v Haskellu dají reprezentovat mnoha datovými typy. Mezi základní patří: * Int - celé číslo omezeného rozsahu (minimálně -2^29 . +more 2^29-1) * Word - celé číslo bez znaménka se stejnou velikostí jako Int * Integer - celé číslo neomezeného rozsahu * Double a Float - čísla s plovoucí desetinnou čárkou (dvojitá resp. jednoduchá přesnost) * Ratio a - racionální číslo s čitatelem a jmenovatelem celočíselného typu a.
Znaky
Pro reprezentaci znaků se používá typ Char, který umožňuje ukládat znaky Unicode.
Booleany
K ukládání pravdivostních hodnot slouží typ Bool, který může nabývat dvou hodnot: True a False.
Seznamy
Seznamy jsou v Haskellu nejčastěji používaným složeným datovým typem. Jsou homogenní, což znamená, že mohou obsahovat hodnoty pouze jednoho datového typu (např. +more celé číslo Int, pravdivostní hodnota Bool, nebo další seznam). Seznamy se zapisují do hranatých závorek a hodnoty se oddělují čárkou:.
[0,2,4,6] ['s', 't', 'r', 'i', 'n', 'g'] [True,False,True,False] []
Je možno použít ekvivalentní zápis:
(0:2:4:6:[])
Pokud je potřeba seznam hodnot z určitého rozsahu, je možno použít tento zápis:
[1..5] -- ekvivalentní [1,2,3,4,5] ['a'..'g'] -- ekvivalentní "abcdefg" [2,4..12] -- ekvivalentní [2,4,6,8,10,12] [9,6..(-12)] -- ekvivalentní [9,6,3,0,-3,-6,-9,-12]
Haskell rovněž umožňuje použití nekonečných seznamů:
[1..] -- všechna přirozená čísla (1,2,3,4,5,6...) [1,3..] -- lichá kladná čísla (1,3,5,7...) [10,9..] -- 10,9,8,7,6,5,4...
Pro zápis řetězců se využívá syntaktický cukr:
"string" "řekl \"ahoj\"" -- ['ř', 'e', 'k', 'l', ' ', '"', 'a', 'h', 'o', 'j', '"']
Funkce pro práci se seznamy
Pro práci se seznamy v Haskellu je možno použít velké množství funkcí. Mezi nejužívanější lze zařadit: * map f list aplikuje funkci f na každý prvek seznamu list * filter f list vrací seznam všech prvků seznamu list, pro které funkce f vrátila True * head list získá první prvek seznamu * tail list vezme první prvek seznamu a vrátí zbytek * init list vrátí všechny prvky seznamu kromě posledního * length list spočítá délku seznamu * reverse list vrátí prvky seznamu list v opačném pořadí * minimum list získá nejmenší hodnotu ze seznamu * maximum list získá nejvyšší hodnotu ze seznamu * drop n list zahodí prvních n prvků a vrátí zbytek * take n list vrátí seznam prvních n prvků
N-tice (tuples)
N-tice v Haskellu ukládají několik hodnot různých typů. Zapisují se do závorek a prvky se oddělují čárkou:
(2, "dva") -- dvojice, typ (Int, String) ("wow", False, [1,2]) -- trojice, typ (String, Bool, [Int])
Příklady
Definice funkce faktoriálu:
fac 0 = 1 fac n = n * fac (n - 1)
Jiná definice faktoriálu (používá funkci product ze standardní knihovny Haskellu):
fac n = product [1..n]
Naivní implementace funkce vracející n-tý prvek Fibonacciho posloupnosti:
fib 0 = 0 fib 1 = 1 fib n = fib (n - 2) + fib (n - 1)
Eratosthenovo síto - jednoduchá implementace algoritmu pro nalezení všech prvočísel:
primes = es [2 ..] where es (p:t) = p : es [ n | n
Elegantní zápis řadicího algoritmu quicksort:
qsort [] = [] qsort (pivot:tail) = qsort left ++ [pivot] ++ qsort right where left = [y | y = pivot]
Implementace
Následující implementace zcela (nebo téměř zcela) vyhovují standardu Haskell 98 a jsou distribuovány pod open source licencí. * Glasgow Haskell Compiler (GHC) umí překládat zdrojové kódy Haskellu do kódu závislého na architektuře počítače, případně do jazyka C. +more * Hugs je interpret mezikódu (bajtkódu). Nabízí rychlý překlad programů a snesitelnou rychlost spouštění. Je vhodný především pro výukové účely. * nhc98 je dalším interpretem využívajícím mezikód, běh programů je znatelně rychlejší než u Hugsu. Nhc98 se zaměřuje na hospodárnou správu paměti, a je tak ideální pro využití na starších počítačích.
Literatura
THOMPSON, S. Haskell The Craft of Functional Programming. Addison-Wesley 487 s.
Reference
Externí odkazy
[url=http://www. haskell. +moreorg]Domovská stránka Haskellu[/url] * [url=http://haskell. cz/]Haskell. cz[/url] - o Haskellu v češtině * [url=http://naucte-se. haskell. cz]Naucte-se. Haskell. cz[/url] On-line kniha o programování v Haskellu v češtině * [url=http://www. root. cz/serialy/haskell-a-funkcionalni-programovani/]Seriál Haskell a funkcionální programování[/url].