Чтобы прояснить вопрос: речь идет о достоинствах типа типа монады (в отличие от его экземпляров без унифицирующего класса).
После чтения многих ссылок (см. ниже), Я пришел к выводу, что на самом деле класс монады должен решать только только, но большой и решающий, проблема: "цепочка" функций по типам с контекстом. Следовательно, знаменитое предложение "монады - программируемые точки с запятой". Фактически, монаду можно рассматривать как массив функций с вспомогательными операциями.
Я настаиваю на различии между модой class, понимаемой как общий интерфейс для других типов; и эти другие типы, создающие экземпляр класса (таким образом, "монадические типы" ).
Я понимаю, что класс монады сам по себе решает только цепочку операторов, потому что, в основном, он только задает свои экземпляры типа
иметь bind >>=
и return
, и сообщить нам, как они должны себя вести. И в качестве бонуса компилятор помогает кодированию, предоставляя нотацию do
для монадических типов.
С другой стороны,
это каждый индивидуальный тип, создающий экземпляр класса монады, который решает каждую конкретную задачу, , но не только для экземпляра Monad. Например, Maybe
решает "как функция возвращает значение или ошибку", State
решает "как иметь функции с глобальным состоянием", IO
решает "как взаимодействовать с внешним миром" и т.д. Все классы theses инкапсулируют значение в контексте.
Но скоро или позже нам понадобится задействовать операции над такими типами контекстов. Т.е. нам нужно будет организовать вызовы функций на этих типах в определенной последовательности (например, для примера такой проблемы, пожалуйста, прочитайте пример о многозначных функциях в Вы могли бы придумать монады).
И вы решаете проблему цепочки, если у вас есть каждый тип экземпляра класса монады.
Для того, чтобы цепочка работала, вам нужно >>=
только с точной подписью, которую она имеет, и никаким другим. (См. этот вопрос).
Поэтому я предполагаю, что в следующий раз, когда вы определите тип данных контекста T для решения чего-либо, если вам нужно последовательно вызвать вызовы функций (по значениям T), подумайте о том, чтобы сделать T экземпляром Monad
(если вам нужно "цепочка с выбором", и если вы можете использовать нотацию do
). И чтобы убедиться, что вы делаете это правильно, убедитесь, что T удовлетворяет законам монады
Затем я задаю два вопроса специалистам Haskell:
- Конкретный вопрос: есть ли какая-либо другая проблема, которую класс монады решает, если (если оставить в стороне монадические классы)? Если да, то как он сравнивается по отношению к проблеме цепочки операций?
- Необязательный общий вопрос: мои выводы правильно, я что-то не понимаю?
Ссылки
Учебники
- Монады в картинках Определенно стоит; сначала прочитайте это.
- Пригоршня монад
- Вы могли бы придумать монады
- Монады - это деревья (pdf)