Haskell wikibook утверждает, что
Экземпляры MonadPlus должны выполнять несколько правил, так же как экземпляры Монады необходимы для выполнения трех законов монады.... Самое главное, что mzero и mplus образуют моноид.
Следствием этого является то, что mplus должно быть ассоциативным. Haskell wiki соглашается.
Однако Олег, в одной из своих многочисленных поисковых реализаций поиска backback, пишет, что
-- Generally speaking, mplus is not associative. It better not be,
-- since associative and non-commutative mplus makes the search
-- strategy incomplete.
Кошерно ли определить неассоциативный mplus? Первые две ссылки довольно ясно показывают, что у вас нет реального экземпляра MonadPlus, если mplus не является ассоциативным. Но если Олег делает это... (С другой стороны, в этом файле он просто определяет функцию под названием mplus и не утверждает, что mplus является mplus of MonadPlus. Он выбрал довольно запутанное имя, если это правильная интерпретация.)