úterý 28. srpna 2012

Začínám s Haskell - 1.kapitola

Někde jsem četl, že je dobrý každý rok se naučit 1 nový programovací jazyk. Proto jsem se rozhodl, že tento rok se naučím Haskell. Budu si sem zapisovat poznámky z knížky Learn You a Haskell for Great Good!

Kapitola 2. Starting out

/=      nerovná se
succ   vrátí následující prvek (succ 8 == 9; succ 'a' == 'b')
min     vrací ze 2 prvků menší prvek (min 'a' 'b' == 'a', min 8 10 == 8)
max    vrací ze 2 prvků větší prvek
div      celočíselné dělení dvou prvků (div 92 10 == 9; 92 'div' 10 == 9)

Vytvoření funkce

doubleUs x y = x*2 + y*2  
název fce - doubleUs
x y - parametry fce
= začátek těla fce, za tímto je samotné provedení fce

List
ukládá více prvků stejného typu
let lostNumbers = [4,8,15,16,23,42]        (let definuje jméno proměnné)

String je list znaků
++     spojování

['w','o'] ++ ['o','t'] == "woot"
[5]++[1,2,3,4,5] == [5,1,2,3,4,5]
"ha" == ['h', 'a']

:    přidání prvku na začátek listu

'A':" SMALL CAT" == "A SMALL CAT"
 5:[1,2,3,4,5] == [5,1,2,3,4,5]

!!    získání prvku podle indexu (od 0)
"Steve Buscemi" !! 6  == 'B'

Porovnávání listů - porovnání prvků postupně (porovnává se 1. prvek, pak 2.prvek atd.)
[2, 10] < [1,100,1000] == false

head    vrací head (první prvek) z listu
tail       vrací tail = list - head
last      vrací poslední element
init       vrací vše

Texas ranges
- rozsahy čísel nebo znaků pro zkrácený zápis
[1..20], [2,4..20] (sudá čísla do 20), ['A'..'z'] (písmena A až Z + nějaké znaky + malé a až z), ['a'..'Z'] (prádzné pole), [20,19..1] (čísla od 20 do 1)

cycle    bere parametr list a vytvoří opakováním nekonečný list
repeat    bere prvek a vytvoří nekonečný list opakováním toho 1 prvku
replicate    první parametr určí počet opakování druhého parametru

Generátor listu
- má 3 části: první je výstupní funkce; druhá je list, ze kterého se bude brát x; třetí jsou podmínky pro x.
- výstupem je nový list

boomBangs xs = [ if x < 10 then "BOOM!" else "BANG!" | x <- xs, odd x]   - první část (před pipou) je if podmínka, druhá část: pro x se bere z parametru pole xs pro funkce boomBangs, třetí část x musí být liché.

[ x | x <- [10..20], x /= 13, x /= 15, x /= 19] - tady jsou 3 podmínky ve 3.částí

[ x*y | x <- [2,5,10], y <- [8,10,11], x*y > 50] - tady se ve 2.části bere ze 2 listů zároveň

length' xs = sum [1 | _ <- xs]   -  v této fci nás nezajímá, co se bere z listu za hodnoty, vždy se vrací 1. Nakonec dostaneme list jedniček o stejné délce jako je parametr xs a ten sečteme - dostaneme délku xs.

Tuples (N-tice)
Typy tuplu jsou závislé na tom, kolik obsahují prvků a jakého typu jsou tyto prvky.
- tuply nemusejí být homogenní jako list - můžou obsahovat prvky různého typu

[(1,2),(8,11),(4,5)] - ok, vnější list musí obsahovat jen prvky stejného typu, což ty vnitřní tuply jsou
[(1,2),(8,11,5),(4,5)] - chyba, vnitřní tuply nejsou stejného typu - tuply obsahují prvky stejného typu, ale tuply nemají stejný počet prvků.

fst    bere parametr tuple o 2 prvcích a vrací 1. prvek
snd   bere parametr tuple o 2 prvcích a vrací 2. prvek 

zip    bere jako parametr 2 listy a kombinuje tyto 2 listy na list obsahující tuply o 2 prvcích
zip [5,3,2,6,2,7,2,5,4,6,6] ["im","a","turtle"]  výsledek: [(5,"im"),(3,"a"),(2,"turtle")]  

Příklad:
jaký pravoúhlý trojúhelník s celočíselnými stranami má všechny strany rovné nebo menší než 10 a jeho obvod je 24?

Žádné komentáře:

Okomentovat