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
. Он выбрал довольно запутанное имя, если это правильная интерпретация.)