Neprogramátor/Funkce vyššího řádu
Funkce vyššího řádu jsou funkce, které přijímají funkce jako argumenty a/nebo je funkce jejich návratová hodnota. Jinými slovy, kouzelná věta je vyššího řádu, když kromě prvního kouzelného slovesa je nějaké další slovo kouzelné věty také kouzelné sloveso a/nebo je kouzelné sloveso výsledek vykonání kouzelné věty.
K čemu se funkce vyššího řádu hodí? Třeba když v oblasti obchodu vyroste konkurence a čaroděje zajímají ceny položek nákupního seznamu
(define nákupní-seznam '("ředkvičky" "rum" "rýže" "tofu" "minerálka"))
jak pro starou cenu
(define (stará-cena položky)
(string-length položky))
tak pro novou cenu
(define (nová-cena položky)
(- 12 (string-length položky)))
Pro čaroděje ceny položek počítá kouzelná hůlka kouzelnou větou začínající kouzelným slovesem ceny-položek
. Čaroděj kouzelné sloveso ceny-pložek
naučil kouzelnou hůlku kouzelnou větou
(define (ceny-položek seznam)
(if (null? seznam)
'()
(cons (cena (first seznam)) (ceny-položek (rest seznam)))))
Jenomže cena
je teď buď stará-cena
nebo nová-cena
. Aby čaroděj nemusel kouzelnou hůlku učit dvě nová, téměř stejná kouzelná slovesa staré-ceny-položek
a nové-ceny-položek
, malinko upraví definici ceny-položek
a přidá cenu cena
jako argument:
(define (ceny-položek seznam cena)
(if (null? seznam)
'()
(cons (cena (first seznam)) (ceny-položek (rest seznam) cena))))
Pak může kouzelná hůlka vypočítat staré ceny položek:
(ceny-položek nákupní-seznam stará-cena)
'(9 3 4 4 9)
i nové ceny položek:
(ceny-položek nákupní-seznam nová-cena)
'(3 9 8 8 3)
Kouzelná věta začínající kouzelným slovesem ceny-položek
vlastně změní nákupní seznam na seznam čísel. Transformace seznamu na jiný, stejně dlouhý seznam, se používá velmi často. Proto v programovacím jazyce Racket existuje funkce vyššího řádu map
.
(map stará-cena nákupní-seznam)
(map nová-cena nákupní-seznam)
'(9 3 4 4 9) '(3 9 8 8 3)
Funkce vyššího řádu | Uzávěry a anonymní funkce ► |