2015-03-05 4 views
0

Мое понимание заключается в том, что для монады-монаха каждый шаг имеет продолжение и закрытие.Какая категория ошибок, предотвращающих монады?

Это author writes:

Мы видели, что чистота, сильные типы и монады могут:

...

  • Предотвращение ошибок, которые могут возникнуть в результате путаницы между различными фазами исполнения.

Мой вопрос: Что такое категория ошибок, которые мешают монады?

+0

Это больше связано с чистотой и сильными частями, чем с частью монады. Кроме того, do не является монадой, это всего лишь сокращение для вызова методов Monad. –

+0

Спасибо - это полезно - не могли бы вы расширить это в ответ? – hawkeye

+0

Ну, монады несколько заведомо сложно объяснить, не распространяя заблуждения. Вы еще не видели эту статью? http://blog.sigfpe.com/2006/08/you-could-have-invented-monads-and.html. Кроме того, я написал ответ, который, по моему мнению, объясняет конкретный вид монады прилично и может помочь (он был написан в ответ на вопрос от кого-то, кто пытался избежать монадов): http://stackoverflow.com/questions/23188645/ без монадическая-обработки ошибок в-Haskell/23207315. К сожалению, на самом деле это не касается аспекта предотвращения ошибок при сильной типизации, мне придется подумать о других ресурсах для этого. –

ответ

0

Предположим, вы написали алгоритм, который должен получить обратный вызов. Вы не знаете, что будет делать обратный вызов или что он способен. Самый общий способ принять такую ​​функцию обратного вызова, чтобы получить такую ​​функцию:

Monad m => a -> m b 

Это дает полную свободу для вызывающего абонента (который может выбрать любой m, который является Монадой), отрицая любую такую ​​свободу в медиатеку , Это предотвращает появление побочных эффектов в другой чистой библиотеке, позволяя возникать побочные эффекты, если желающий их желает.

Я использовал этот шаблон раньше в чистом распределителе регистров. В этой библиотеке я никогда не нуждался в эффектах, но хотел, чтобы пользователь мог использовать свои собственные эффекты (например, State) для создания новых блоков и перемещения инструкций.