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 ►