Haskell Hero
Interaktivní učebnice pro začínající Haskellisty
|
Funkce na seznamech IheadUnární funkce vracející první prvek seznamu. Definicehead :: [a] -> a head (x:_) = x Příklad použitíhead [1,2,3] ~> 1 head "ABC" ~> 'A' head [[2.5, 3.0], [4.8, 10.69, 9.12], []] ~> [2.5, 3.0] tailUnární funkce vracející seznam bez prvního prvku. Definicetail :: [a] -> [a] tail (_:s) = s Příklad použitítail [1,2,3] ~> [2,3] tail "ABC" ~> "BC" tail [[2.5, 3.0], [4.8, 10.69, 9.12], []] ~> [[4.8, 10.69, 9.12], []] null
Unární funkce vracející Definicenull :: [a] -> Bool null [] = True null (_:_) = False Příklad použitínull [] ~> True null "" ~> True null [2,3] ~> False null "KK" ~> False lengthUnární funkce vracející délku seznamu. Definicelength :: [a] -> Int length [] = 0 length (x:s) = 1 + length s Příklad použitílength [] ~>* 0 length [1,2,3,4] ~>* 4 length "ABCDE" ~>* 5 length ["A", "AB", "&+#!$"] ~>* 3 Vzorové vyhodnocenílength [1,2,3] neboli length 1:[2,3] za x se dosadí 1, za s se dosadí [2,3] ~> 1 + length [2,3] za x se dosadí 2, za s se dosadí [3] ~> 1 + 1 + length [3] za x se dosadí 3, za s se dosadí [] ~> 1 + 1 + 1 + length [] length [] se vyhodnotí podle první klauzule ~> 1 + 1 + 1 + 0 ~>* 3 Poznámka
Jelikož se v definici na pravé straně druhé klauzule nevyskytuje length (_:s) = 1 + length s Spojování seznamů
Spojení dvou seznamů se provádí pomocí binárního operátoru Definice(++) :: [a] -> [a] -> [a] [] ++ t = t (x:s) ++ t = x : (s ++ t) Příklad použití[1,2] ++ [3,4,5] ~>* [1,2,3,4,5] "ABC" ++ "DE" ~>* "ABCDE" [] ++ [True, False] ~> [True, False] Vzorové vyhodnocení[1,2,3] ++ [4] což je zaměnitelné s 1:[2,3] ++ [4] podle druhé klauzule x = 1, s = [2,3], t = [4] ~> 1 : ([2,3] ++ [4]) x = 2, s = [3], t = [4] ~> 1 : (2 : ([3] ++ [4])) x = 3, s = [], t = [4] ~> 1 : (2 : (3 : ([] ++ [4]))) podle první klauzule ~> 1 : (2 : (3 : [4])) ≡ [1,2,3,4] Poznámka
Při každém spojování seznamů se prvky z prvního seznamu musí přeskládat do seznamu druhého. To znamená, že vyhodnocení výrazu Výběr prvku
Prvek se ze seznamu vybírá pomocí binárního operátoru
Definice(!!) :: [a] –> Int –> a (x:_) !! 0 = x (_:s) !! k = s !! (k-1) Příklad použití[1,2,3] !! 0 ~>* 1 "ABCDE" !! 4 ~>* 'E' [[1,2], [3], [], [4,5]] !! 3 ~>* [4,5] take
Binární funkce, kde výraz Definicetake :: Int –> [a] –> [a] take 0 _ = [] take _ [] = [] take n (x:s) = x : take (n-1) s Příklad použitítake 2 [1,2,3,4] ~>* [1,2] take 3 [2] ~>* [2] take 1 "ABCD" ~>* "A" drop
Binární funkce, kde se výraz Definicedrop :: Int –> [a] –> [a] drop 0 s = s drop _ [] = [] drop n (_:s) = drop (n-1) s Příklad použitídrop 2 [1,2,3,4,5] ~>* [3,4,5] drop 0 [1,2,3] ~>* [1,2,3] drop 8 [1,2,3] ~>* [] concatUnární funkce, která spojí seznamy v seznamu seznamů v jeden seznam. Definiceconcat :: [[a]] –> [a] concat [] = [] concat (s:t) = s ++ concat t Příklad použitíconcat [[1,2], [3,4,5], [], [6,7]] ~>* [1,2,3,4,5,6,7] concat ["ABC", "", "DEF"] ~>* "ABCDEF" |