Haskell Hero

Interaktivní učebnice pro začínající Haskellisty

Seznamy I

Seznam jako vláček

Jak jsme si řekli v kapitole o užitečných funkcích, seznamy se zapisují do hranatých závorek a jejich prvky se oddělují čárkami.

[8,5,3]
Prázdný seznam vyrobíme pomocí dvou hranatých závorek [] a pro vložení prvku do seznamu použijeme binární operátor (:). Vložení prvku 10 do seznamu [8,5,3] se tedy provede následovně:
10 : [8,5,3]
Výraz 10:[8,5,3] se již dále nevyhodnocuje, je v nezjednodušitelném tvaru a zaměnitelný s výrazem [10,8,5,3]. Obecněji jsou všechny z následujících výrazů libovolně zaměnitelné ((:) sdružuje zprava):
[10,8,5,3]
10:[8,5,3]
10:8:[5,3]
10:8:5:[3]
10:8:5:3:[]

Konečně, seznam zapsaný ve tvaru 8:5:3:[] můžeme znázornit jako vláček. Od běžného vlaku se liší akorát tím, že místo živých cestujících převáží data a mašinka vagónky netáhne, ale tlačí je před sebou.

Takže seznam je vláček, kde jeho prvky jsou znázorněny jako vagónky, operátor (:) jako spojovník vagónů a prázdný seznam jako mašinka.


Seznam [8,5,3] jako vláček

Operace se seznamy

Se seznamem umíme udělat tři věci:

  1. přidat prvek na jeho začátek (na levou stranu)
  2. podívat se, jaký je jeho první prvek a jak vypadá seznam bez prvního prvku
  3. otestovat, zda je prázdný (popřípadě jednoprvkový, dvouprvkový, ...)
Nic víc. Všechny další operace se seznamy jsou postaveny na těchto třech základních.

Například funkce head, která vrací první prvek seznamu, je definována následovně:

head       ::  [a] -> a
head (x:s)  =  x
Ukažme si, jak vypadá vyhodnocení výrazu head [1,2,3].

  • seznam [1,2,3] rozepíšeme tak, že z něj vytáhneme první prvek: 1:[2,3]
  • v levé straně definice funkce head dosadíme 1 za x a [2,3] za s.
  • výraz nahradíme pravou stranou definice, což je obecně x, zde dosazený prvek 1.

Výsledkem je tedy 1.

Poznámka: Jelikož na pravé straně definice funkce head není proměnná s nikde použita, můžeme ji nahradit podtržítkem.

head (x:_) = x