'Recursively visit subexpressions.  Apply \'function\' to each
subexpression and pass the result of each function application
to the \'combinator\' for aggregation:
return combinator(map(function, self.subexpressions))
Bound variables are neither applied upon by the function nor given to
the combinator.
:param function: ``Function<Expression,T>`` to call on each subexpression
:param combinator: ``Function<list<T>,R>`` to combine the results of the
function calls
:return: result of combination ``R``'

def visit(self, function, combinator):

    raise NotImplementedError()
