constexpr auto foldr_impl(F f, S s, ...) { return foldr1(f, type<Xs>..., s); }
constexpr auto foldr(F f, S s, Xs ...xs) { return foldr1(f, xs..., s); }
// foldr1(F, [x1, ..., xn]) = F(x1, F(x2, ..., F(xn-1,xn)...)) int foldr1(const fun2 F, const list L) { if (tl(L) == nil) return hd(L); else return F(hd(L), foldr1(F, tl(L))); }