5.1. Seznamy v Haskellu

Seznam je v Haskellu kolekce hodnot téhož datového typu. Ke každému typu t můžeme vytvořit typ [t], představující seznam hodnot typu t. Tímto typem může být libovolný datový typ, včetně funkce nebo jiného seznamu.

         [1,2,3,5,8] :: [Int]
         [True]      :: [Bool]
         [fac,inc]   :: [Int -> Int]
         [[Int]]     :: [[1,3],[2,4,6],[]]
Pořadí prvků v seznamu je významné, stejně jako počet výskytů jednotlivých hodnot, takže například seznamy [1,2], [2,1] a [1,2,1] jsou navzájem různé.

Speciálním případem seznamu je seznam hodnot typu Char, který je ekvivalentem typu String. Následující definice jsou tedy ekvivalentní:

         ['a','h','o','j'] :: String
         "ahoj"            :: String

Seznam je tedy tvořen posloupností prvků v hranatých závorkách, jednotlivé prvky se oddělují čárkou. Prázdný seznam [] neobsahuje žádné prvky. Každý neprázdný seznam můžeme vytvořit spojením nějakého prvku x a seznamu xs tak, že prvek x přidáme před seznam xs. To zapisujeme pomocí operátoru dvojtečka jako x:xs. Zápis [1,2,3] je tedy zkrácenou formou výrazu 1:(2:(3:[])) a vzhledem k tomu, že operátor dvojtečka je asociativní zprava, můžeme závorky vynechat a psát 1:2:3:[].

Seznamy tvořené částí aritmetické posloupnosti můžeme vyjádřit ve zkráceném tvaru pomocí jednoho z následujících zápisů:

         [2..5]     = [2,3,4,5]
         [1,3..10]  = [1,3,5,7,9]
         ['a'..'d'] = "abcd"


Cvičení
Cvičení
  • Kolik prvků obsahuje seznam [2,3]? Kolik prvků obsahuje seznam [[2,3]]? Jaký je typ seznamu [[2,3]]?
  • Jakou hodnotu má seznam [0, 0.1 .. 1]? Ověřte si svou odpověď pomocí programu a vysvětlete, k jakým problémům zde může docházet.