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