The problem is that MapReduce is a single thing, a reducer cannot exist without a mapper, and a mapper in theory only produce intermediate results. It does need to happen at the same time, or differently said, it needs to happen in pairs: A reducer is pretty much tied to the output produced by the associated mapper in most of the cases.

Having separate methods would mean that we will need to match what mapper is supposed to run with what reduced once the results are fetched. An example of a possible problem is:

    $query
        ->mapResults(function(...) { $mr->emitIntermediate('foo', 1) } )
        ->mapResults(function(...) { $mr->emitIntermediate('bar', new Thing($row)) } )
        ->reduceResults(function(...) { $mr->emit(array_sum($row)) })

What possible meanings have this? Run the mappers first and the the reducer is one of the meanings, the other, and the only one that would not throw a fatal error is: run the first mapper then the first reducer, then map again. As you can see, this is confusing and pairing the functions later will be problematic.