Haskell (programovací jazyk)

Haskell
Logo programovacího jazyka Haskell
Logo programovacího jazyka Haskell
Paradigmafunkcionální
Vznik1990
AutorSimon Peyton Jones, Lennart Augustsson, Dave Barton, Brian Boutel, Warren Burton, Joseph Fasel, Kevin Hammond, Ralf Hinze, Paul Hudak, John Hughes, Thomas Johnsson, Mark Jones, John Launchbury, Erik Meijer, John Peterson, Alastair Reid, Colin Runciman, Philip Wadler
Poslední verzeHaskell 2010 (červen 2010)
Poslední nestabilní verzeoznámena verze Haskell 2014
Typová kontrolasilná, statická
Hlavní implementaceGHC, Hugs, NHC, JHC, Yhc, UHC
DialektyHelium, Gofer
Ovlivněn jazykyClean, FP, Gofer, Hope and Hope+, Id, ISWIM, KRC, Lisp, Miranda, ML and Standard ML, Orwell, SASL, SISAL, Scheme
Ovlivnil jazykyAgda, Bluespec, C++11/Concepts, C#/LINQ, CAL, Cayenne, Clean, Clojure, CoffeeScript, Curry, Elm, Epigram, Escher, F#, Frege, Isabelle, Java/Generics, Kaya, LiveScript, Mercury, Omega, Perl 6, Python, Qi, Scala, Timber, Visual Basic 9.0
OSmultiplatformní
Webwww.haskell.org

Haskell 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. 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 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ě.[1] 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í.[2] Plánované zařazení některých rozšíření je pojmenováno jako Haskell′ (Haskell Prime).[3]

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. 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.[4] 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. 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ří:

  • Intcelé číslo omezeného rozsahu (minimálně -2^29 .. 2^29-1)
  • Wordcelé čí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 aracioná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ř. 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ů
Příklady
map negate [1,2,3,4] -- [-1,-2,-3,-4]
filter odd [1,2,3,4,5,6] -- [1,3,5]
take 3 [1,3..20] -- [1,3,5]
head "Hello" -- 'H'
tail "world" -- "orld"
init [True,True,False,True,False] -- [True,True,False,True]
length [] -- 0
reverse "gnirts" -- "string"
minimum [4,2,6,4,1,9,3] -- 1
maximum [4,2,6,4,1,9,3] -- 9
drop 3 [1,3..20] -- [7,9,11,13,15,17,19]

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<-t, n`mod`p/=0 ]

Elegantní zápis řadicího algoritmu quicksort:

qsort [] = []
qsort (pivot:tail) =
  qsort left ++ [pivot] ++ qsort right
  where
    left = [y | y <- tail, y < pivot]
    right = [y | y <- tail, 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)[5] 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.
  • Hugs[6] 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[7] 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

  1. O historii Haskellu v knize Real World Haskell
  2. Haskell 98 revised report
  3. Haskell Prime. hackage.haskell.org [online]. [cit. 2008-12-30]. Dostupné v archivu pořízeném dne 2008-12-19. 
  4. – oficiální stránky jazyka Haskel
  5. The Glasgow Haskell Compiler
  6. Hugs 98
  7. nhc98. www.cs.york.ac.uk [online]. [cit. 2005-04-18]. Dostupné v archivu pořízeném z originálu dne 2005-02-05. 

Externí odkazy

  • Logo Wikimedia Commons Obrázky, zvuky či videa k tématu Haskell na Wikimedia Commons
  • Domovská stránka Haskellu
  • Haskell.cz – o Haskellu v češtině
  • Naucte-se.Haskell.cz On-line kniha o programování v Haskellu v češtině
  • Seriál Haskell a funkcionální programování
Programovací jazyky
abecední seznam programovacích jazyků
multiparadigmatické
Ada • C++Common Lisp • D • F# • Go • Oberon • PerlPHPPythonRuby • Rust • Scala • Swift • Tcl (Tk) • Vala
strukturované (procedurální)
AWK • C • COBOLDCL • Forth • FortranLuaModula-2 / Modula-3 • Pascal • PawnPL/SQL
objektové
BETA • Boo • C# • Eiffel • Java (Groovy, Kotlin) • JavaScriptObject PascalObjective-CSmalltalkVB.NET
funkcionální
Clean • Ceylon • Erlang • Haskell • J • LispWolfram Language / Mathematica • Miranda • OCamlScheme
dotazovací
LINQSPARQLSQLXQueryXSL (XSLTXSL-FOXPath)
logické
Gödel • Prolog
výukové
Baltazar • Baltík • Karel • Kodu Game Lab • Logo • Microsoft Small Basic • Petr • Scratch
ezoterické
BefungeBrainfuckHQ9+MalbolgeOok!PietWhitespace
historické
ALGOL • APL • B • BASICCPL (BCPL) • J • MUMPSPL/ISimula 67SNOBOL
další
ABAPAppleScriptColdFusionJSA • Julia • MATLAB • R • Visual Basic (VBScript) • VimscriptVisual FoxPro
skriptovací/strojový kódkompilované/interpretované • interaktivní/dávkovéWYSIWYG
Webové aplikační frameworky
ASP.NET
ASP.NET MVC • BFC • DotNetNuke • MonoRail • Umbraco
C++
CppCMS
ColdFusion
ColdSpring • Fusebox • Mach-II • Model-Glue • on Wheels • onTap
Common Lisp
ABCL-web • BKNR • SymbolicWeb • UnCommon Web
Java
AppFuse • Flexive • Grails • GWT • ItsNat • JavaServer Faces • Makumba • OpenXava • Reasonable Server Faces • Restlet • RIFE • Seam • Spring • Stripes • StrutsTapestryVaadin • WebWork • Wicket • ZK
JavaScript
AngularJS • Archetype JavaScript Framework • Bonsai (framework) • Brick (framework) • CreateJS • D3 • Dojo • Ember • Enyo (framework) • ExtJs • FabricJS • Fleegix • JavaScriptMVC • jQuery • jTypes • KineticJS • Knockout.js • Lo-dash • midori • MooTools • NodeJs • PaperJS • Processing.js • Prototype • qooxdoo • Raphael (framework) • React • RightJS • Shipyard • SimpleJS • SproutCore (JavaScript/Ruby) • Spry • The X Toolkit • Thorax (framework) • Tree.js • UIZE • Underscore • Vue.js • WebApp Install • YUI • Zepto (framework)
Perl
Catalyst • Dancer • Interchange • Mason • Masser • Maypole • Mojolicious • OX • PEE • Plack • WebGUI
PHP
Agavi • Akelos • CakePHP • Chisimba • CodeIgniter • Garden Platform • Horde • JelixKohana • Kolibri • KumbiaPHP • Laravel • Midgard • Nette Framework • Orinoco • PHPonTrax • PRADO • Qcodo • Qcubed • Seagull • Simplicity • Symfony • WASP • Yii Framework • Zend FrameworkZope
Python
DjangoFlask • Pyjamas • Pylons • TurboGears • web2pyZope
Ruby
Hanami • MerbRuby on Rails • Sinatra
Scala
Lift
Smalltalk
AIDA/Web • Seaside
Ostatní jazyky
Application Express (PL/SQL) • Fusebox (ColdFusion a PHP) • OpenACS (Tcl) • Yaws (Erlang) • HAppS (Haskell)
Autoritní data Editovat na Wikidatech
  • NKC: ph903880
  • PSH: 13866
  • BNE: XX541061
  • BNF: cb12362303j (data)
  • GND: 4318275-6
  • LCCN: sh93003496
  • NLI: 987007561153805171