Would allow fine-grained control over add vs list. Also allows canonicalisation -- e.g. lower-case strings. For this, we should allow two possible customisations: 1. op(a, b) -> a+b 2. transform(a) -> a' x 2 -- whether they act on leaf values or path items.