Это вопрос, который возник несколько раз для меня в коде проекта, особенно в библиотеках. Кажется, в нем есть некоторый интерес, поэтому я подумал, что это может сделать хорошую вики сообщества.
Метод fail
в Монаде рассматривается некоторыми как бородавка; несколько произвольное дополнение к классу, которое не исходит из исходной теории категорий. Но, конечно, в текущем состоянии вещей многие типы Monad имеют логические и полезные экземпляры fail
.
Класс MonadPlus - это подкласс Monad, который предоставляет метод mzero
, который логически инкапсулирует идею отказа в монаде.
Итак, дизайнер библиотеки, который хочет написать некоторый монадический код, который выполняет какую-то обработку отказа, может выбрать, чтобы его код использовал метод fail
в Монаде или ограничил его код классом MonadPlus, чтобы он мог чувствовать хорошо использовать mzero
, хотя он не заботится о моноидальном объединении операции mplus
вообще.
Некоторые дискуссии по этому вопросу находятся на этой странице wiki о предложения по реформированию класса MonadPlus.
Итак, у меня есть один конкретный вопрос:
Какие экземпляры монады, если они есть, имеют естественный метод fail
, но не могут быть экземплярами MonadPlus, потому что у них нет логической реализации для mplus
?
Но меня в основном интересует обсуждение этой темы. Спасибо!
РЕДАКТИРОВАТЬ. Последняя мысль произошла со мной. Недавно я узнал (хотя он и есть в документах для fail
), что монадическая нотация "делать" снимается таким образом, что ошибки совпадения шаблонов, как и в (x:xs) <- return []
, вызывают монаду fail
.
Похоже, что на разработчиков языков должно было сильно повлиять перспектива некоторой автоматической обработки отказа, встроенной в синтаксис haskell при включении fail
в Monad.