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