Existuje nějaký reálný příklad použití reduceRight? Protože spousta jazyků to nemá a nenapadá mě, kde by to bylo vhodné a ten příklad z https://www.root.cz/clanky/podpora-funkcionalniho-programovani-v-jazyku-lua-s-vyuzitim-knihovny-moses-pokracovani/#k07 je spíš hodně umělý.
Jako typický příklad reduceRight mě napadá umocňování
reduce({3, 2, 2, 2}, function (x, y) return x ^ y end) -- 6561.0
reduceRight({3, 2, 2, 2}, function (x, y) return y ^ x end) -- 43046721.0
nebo pak vytvoření vnořené tabulky
t=reduceRight({ "a" , "b" , "c" , "d", 2 }, function (x, y) return {[y]=x} end)
t.a.b.c.d -- 2
v obou dvou případech to alespoň v mých očích trochu zabijí pořadí argumentů v reduceRight, já bych to čekal naopak, ale asi je to věc zvyku.
Já jsem něco podobného nedávno použil v Raku, když jsem potřeboval vytvořit něco jako linkedlist.. Tam to funguje tak, že operátory mají asociativnost a reduce pak pracuje na podle toho. Asociativnost operátoru pro vytvoření dvojice => (něco jako v lispu .) je zprava. Tak jsem napsal něco jako
(1...10).reduce: &[=>] #1 => 2 => 3 => 4 => 5 => 6 => 7 => 8 => 9 => 10 #resp. zkráceně [=>] 1...10
podobně bych mohl ten příklad s umocňováním zapsat v Raku
[**] 3,2,2,2 #43046721
ještě mě při čtení https://www.root.cz/clanky/podpora-funkcionalniho-programovani-v-jazyku-lua-s-vyuzitim-knihovny-moses-pokracovani/#k04 napadlo, že toto je dost zásadní problém Luy. Když se iteruje přes pole, které obsahuje nil, tak to jde (aspoň AFAIK) jen přes počítanou smyčku s #pole, což je dost škaredý způsob. Jakékoli použití next() nebo ipairs() skončí na prvním nil a ani autoři se k tomu nikdy nevyjádřili :(