- Z venku se tváří jako běžná datová struktura, ale hodnoty počítá až v momentě kdy je o ně zažádáno
- Pro zrychlení můžeme jednou spočítané hodnoty kešovat
- Ukázka jako seznamu, který poskytuje svůj průměr a mediám
Příslib
- Dosud nevypočítaná hodnota, se kterou můžeme jako s hodnotou nakládat
- Čili můžeme ji ukládat, používat jako argument atd.
- Příklad je posloupnost, kde -tý člen počítáme až když ho chceme zjistit
;; konstruktor
(defmacro delay (expr)
`(lambda () ,expr))
;; vynucuje vyhodnocení
(defun force (promise)
(funcall promise))
- Nevýhodou je že se pokaždé počítá hodnota znovu (chceme kešovat opět)
- Uděláme z příslibu datovou strukturu, která si bude hodnotu pamatovat
Bezpečnost datových struktur
Do datových struktur nezasahujeme jinak než pomocí dokumentovaných operací. Mohlo by dojít k uvedení do nekonzistentního stavu.
Proudy
- Takové líné seznamy (jejich
cdr
se vypočítá až když je potřeba)
Proud
- symbol
nil
, tzv. prázdný proud nebo- pár, jehož cdr je příslib proudu, tj. hodnoty vyhovující opět této definici.
- Mohou být nekonečné
- Práce je dost podobná jako se seznamy
Řetězení funkcí na lineárních datových strukturách
- Seznamy chápeme jako celistvé hodnoty (funkcionální styl)
- Můžou být vstupem i výstupem funkce
- Volání funkcí na jeden seznam za sebou … řetězení
- Máme několik základních operací na seznamech
Mapování
- Převod seznamu na jiný, stejně dlouhý seznam, jehož prvky vznikly aplikací dané funkce na prvky výchozího seznamu.
Filtrace
- Vypuštění prvků seznamu, které splňují (nesplňují) danou podmínku, případně jsou (nejsou) nějakým způsobem totožné se zadanou hodnotou.
Redukce
- Výpočet hodnoty ze seznamu postupnou aplikací zadané funkce dvou argumentů vždy na předchozí výsledek a další prvek seznamu.
- Mapování i filtraci lze napsat pomocí redukce
Třídění
- Uspořádání prvků seznamu podle zadaného kritéria (funkce dvou argumentů).
Hledání
- Zjištění prvku seznamu, který splňuje (nesplňuje) zadanou podmínku nebo je (není) nějakým způsobem totožný se zadanou hodnotou. Hledání lze chápat jako speciální typ redukce, ovšem s tím omezením, že při redukci nelze přerušit prohledávání seznamu, když je hledaný prvek nalezen.
Generátory
- Abstraktní datová struktura se složkou, jejíž hodnota se při každém přístupu změní
- Alternativní název itetáror (např. v Pythonu)
- Používají vedlejší efekt (nepatří do funkcionálního programování)