'Recursively visit subexpressions.  Apply \'function\' to each
subexpression and pass the result of each function application
to the \'combinator\' for aggregation.  The combinator must have
the same signature as the constructor.  The function is not
applied to bound variables, but they are passed to the
combinator.
:param function: ``Function`` to call on each subexpression
:param combinator: ``Function`` with the same signature as the
constructor, to combine the results of the function calls
:return: result of combination'

def visit_structured(self, function, combinator):

    return self.visit(function, (lambda parts: combinator(*parts)))
