We have two competing tensions that have been guiding the work so far, which is scattered across a few dozen different proposals and patches in Phab and is alarmingly intricate to detail.We've generally been guided by the notion you suggest here. In the wake of the AMP, the 'M' suffix really comes to mean the minimal set of effects needed to get the effect. This lets us generalize large numbers of combinators in Control.Monad (e.g. when/unless/guard) to 'just work' in more contexts.However, we also have to balance this carefully against two other concerns:1.) Not breaking user code silently in undetectable ways.This is of course the utmost priority. It guides much of the AMP, including the 'backwards' direction of most of the dependencies. e.g. The reality is a large number of folks wrote (*>) = (>>) in their code, so e.g. if we defined (>>) = (*>), we'd get a large chunk of existing production code that just turns into infinite loops. We can always do more later as we find it is safe, but "first do no harm."
2.) Not introducing rampant performance regressions.David Feuer has been spending untold hours on this, and his work there is a large part of the source of endless waves of proposals he's been putting forth.Considering `liftM2` as 'redundant' from `liftA2` can be dangerous on this front.
The decision of if we can alias liftM3 to liftA3 needs to be at least partially guided by the question of whether the latter is a viable replacement in practice. I'm not prepared to come down on one side of that debate without more profiling data.
Adding liftA4, liftA5 runs afoul of neither of these caveats. Aliasing liftMn to liftAn is something that potentially runs afoul of the latter, and is something that we don't have to do in a frantic rush. The world won't end if we play it safe and don't get to it in time for 7.10.