add higher order reduce