Haskell Hero
Interaktivní učebnice pro začínající Haskellisty
|
Typy IZákladní typyTypy jako krabičky Datový typ je souhrnné označení hodnot se stejnými vlastnostmi. Krabičkově je to krabička, která obsahuje krabičky stejného tvaru.
Že je 1 :: IntegerPodobně je to i s dalšími typy: 'v' :: Char True :: Bool 5.0 :: Float
Haskell si umí typ funkce odvodit sám, ale pokud mu jej napíšeme, lépe se nám pak budou hledat chyby v našich definicích. Pokud například chceme definovat unární funkci kratPet x = even xa Hugs by to bez připomínky vzal. Problém by nastal až v situaci, kdy bychom tuto funkci poprvé použili a zjistili bychom, že funkce nevrací Integer , ale Bool . Pokud bychom použili typovou anotaci
kratPet :: Integer -> Integer kratPet x = even xpřišlo by se na chybu už při nahrávání skriptu do interpretu. Datové strukturyUspořádané n-tice
Mějme například uspořádané dvojice (True,7), (False,-1) :: (Bool,Integer) ("Jan",1.0,'w'), ("Jana",2.6, '$') :: (String,Float,Char) (5,(False,4)), (7,(False,-1)) :: (Integer,(Bool,Integer)) () :: () -- uspořádaná nultice Seznamy
Narozdíl od uspořádaných n-tic mohou být v seznamu hodnoty pouze jednoho typu. Například [True,False,False,True] :: [Bool] [5.0,6.105,10.89] :: [Float] [(5,'a'),(7,'W')] :: [(Integer,Char)] -- seznam dvojic [[1,2,5],[],[11,14,15,16]] :: [[Integer]] -- seznam seznamů celých číselPrázdný seznam je sám o sobě bez dalšího upřesnění typu seznam čehokoli. [] :: [a]
Zvláštní typ seznamu je seznam znaků String ≡ [Char] "Ahoj" ≡ ['A','h','o','j'] "#&@?!" ≡ ['#','&','@','?','!'] Typy funkcí
Typová anotace funkce vypadá následovně: [funkce] :: typ prvního argumentu -> typ druhého argumentu -> ... -> typ výsledku Příklad:
Definujte funkci Taková definice by mohla vypadat následovně: plus2 :: Integer -> Integer -> Integer plus2 x y = x + y Polymorfní typy
Funkce id x = x Jaký je její typ? Pokud do ní vložíme celé číslo, vrátí celé číslo. id 5 ~> 5Takže by její typ mohl být id :: Integer -> Integer .
Pokud bychom jí tento typ přiřadili, zbytečně bychom omezili její použití. Například bychom do ní nemohli vložit seznam Stringů. id ["abc","DeQ","ASDF"] ~> ["abc","DeQ","ASDF"]A co víc – my bychom chtěli, aby pracovala i s funkcemi. (id even) 5 ~> even 5 ~> FalseTím pádem by musela mít typ id :: (Integer -> Bool) -> Integer -> Bool Proto se zavádí polymorfní typy. Zapisují se řetězcem začínajícím malým písmenem, většinou pouze jedním malým písmenem ze začátku abecedy. Tomuto zápisu se říká typová proměnná.
Funkce |