code: function visit (composition, f) {
    composition = Object.assign({}, composition) // copy
    const combinator = composition['.combinator']()
    if (combinator.components) {
      composition.components = composition.components.map(f)
    }
    for (let arg of combinator.args || []) {
      if (arg.type === undefined && composition[arg.name] !== undefined) {
        composition[arg.name] = f(composition[arg.name], arg.name)
      }
    }
    return new Composition(composition)
  }
docs: apply f to all fields of type composition