- Monáda (řecká filosofie) je termín užívaný antickými filozofy Pythágorem, Parmenidem, Xenofánem, Platónem, Aristotelem a Plotínem jako termín pro Boha, první bytost, nebo veškeré bytí.
- V monismu je to koncept jediné podstaty metafyzické a teologické teorie.
- V gnosticismu je to prvotní Božské hledisko.
- Monády jsou základním pojmem filosofie Gottfrieda Leibnize. Monadologie je název knihy tohoto autora.
- Čínská monáda je symbol
vyjadřující princip Jin a Jang.
- Monády jsou zastaralým alternativním pojmenováním prvoků; termín přetrvává v biologickém názvosloví v některých složeninách (např. kryptomonády).
- Monády ve funkcionálním programování
- Funkcionální Programování –Monáda je funktoriální datový typ vybavený dvěma přirozenými transformacemi umožňujícími asociativní skládání operací nad monádami. Formálně je monáda monoidem v kategorii endofunktorů v kategorii typů (v Haskellu kategorie Hask). Obecně je-li {\displaystyle ({\mathcal {C}},\otimes ,I)} tenzorová kategorie (kde {\displaystyle \otimes } je bifunktor a {\displaystyle I\in \mathrm {Ob} ({\mathcal {C}})}), monády jsou monoidy v {\displaystyle ([{\mathcal {C}},{\mathcal {C}}],\circ ,I)}.Přirozené transformace jsou u každé monády {\displaystyle T} multiplikace {\displaystyle \mu :T^{2}\rightarrow T} a jednotka {\displaystyle \eta :I\rightarrow T} splňující {\displaystyle \mu \circ \mu T=\mu \circ T\mu (T^{3}\rightarrow T)} a {\displaystyle \mu \circ \eta T=1=\mu \circ T\eta }. Ve funkcionálním programování se tyto operace zpravidla nazývají join a unit. Příkladem monády je kontinuace, kde {\displaystyle \eta } je funkcí z {\displaystyle A} do {\displaystyle (A\rightarrow R)\rightarrow R} definovaná jako {\displaystyle \eta x=\lambda f.f(x)} a speciální operace vázání je {\displaystyle m>\!\!\!>\!\!=f=\lambda g.m(\lambda x.f(x)(g))}, přičemž {\displaystyle \mu x} je {\displaystyle x>\!\!\!>\!\!=\lambda y.y}.Monády umožňují formulovat kód s vedlejšími efekty tak, aby byl referenčně transparentní, a tedy “čistý” (ve funkcionálním smyslu). Monády jsou zpravidla generické a jejich druh je {\displaystyle (*\rightarrow *)\rightarrow *}.Z každého endofunktoru lze vytvořit volnou monádu.
- 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.
- 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 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á.
- Čísla se v Haskellu dají reprezentovat mnoha datovými typy. Mezi základní patří:
Int
– celé číslo omezeného rozsahu (minimálně -2^29 .. 2^29-1)Word
– celé číslo bez znaménka se stejnou velikostí jakoInt
Integer
– celé číslo neomezeného rozsahuDouble
aFloat
– čísla s plovoucí desetinnou čárkou (dvojitá resp. jednoduchá přesnost)Ratio a
– racionální číslo s čitatelem a jmenovatelem celočíselného typua
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
aFalse
.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 funkcif
na každý prvek seznamulist
filter f list
vrací seznam všech prvků seznamulist
, pro které funkcef
vrátilaTrue
head list
získá první prvek seznamutail list
vezme první prvek seznamu a vrátí zbytekinit list
vrátí všechny prvky seznamu kromě posledníholength list
spočítá délku seznamureverse list
vrátí prvky seznamulist
v opačném pořadíminimum list
získá nejmenší hodnotu ze seznamumaximum list
získá nejvyšší hodnotu ze seznamudrop n list
zahodí prvníchn
prvků a vrátí zbytektake n list
vrátí seznam prvníchn
prvků-
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])
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]
- 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.