Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save nlinker/7a4bbf815322b5ffe695055b73329688 to your computer and use it in GitHub Desktop.
Save nlinker/7a4bbf815322b5ffe695055b73329688 to your computer and use it in GitHub Desktop.
Хм... Сложно согласиться с
> в Haskell монады -- это способ записать _императивный_ код в полностью декларативном языке.
Наверное если смотреть технически - то это верное высказывание.
Но оно скрывает суть. Скрывает смысл "пользы от монад".
Насколько я помню...
Монады - они и в Африке монады. В независимости от того какой язык - чисто декларативный/функциональный или нет.
Сам по себе тип Maybe - не есть монадой если не отвечает "монадным законам".
Грубо - если для него не реализованы операции bind (>>=) и return (плюс еще две другие, но то уже меньшее...).
То есть какая то штука есть монадой если "реализовывает интерфейс монады" (в хаскеле - реализовывает класс типов Monad)
И нужны Монады, то есть по сути те функции которые определяет интерфейс/класс типов Monad - для того
что бы "под капотом" неявно обрабатывать "сайд" эффекты
(которые эта монада представляет, в Maybe - "отсутствие значения", в Either - "ошибку"),
например через тот же bind который абсолютно функциональный а не императивный.
Иначе пришлось бы писать кучу вложенного boilerplate кода типа "если None то передаем None дальше,
если нет то извлекаем значение, делаем что нужно, заворачиваем обратно, передаем дальше".
И вот как раз что бы сделать код DRY для таких случаев - и нужен bind и компания.
Просто в хаскеле решили к "чисто функциональному/декларативному >>=" добавить еще и императивный do
Но никто не заставляет использовать этот синтаксический сахар.
Этот do синтаксис существует как "дополнение для удобства" а не есть целью использования монад в хаскеле,
да и вообще в любом другом месте.
Поэтому мне также не нравиться выражение "монады в хаскеле это необходимость". Звучит как "пришлось". Но в этом же была вся цель, в том что "мы сами так захотели", "никто нас не принуждал"... Одна из идей хаскеля (как мне кажется) - в программировании с полным контролем всего и вся. Те кто используют хаскель - по сути живут идеей - "всегда делать все по законам, по правилам, без компромиссов".
В клоуже же одна из идей - "контролируем то что решим". А что не хотим - не контролируем.
"Мы - гибкие, для нас законы - напутствие, ориентир а не обязанность (пускай и мы сами ее бы выбрали)".
Поэтому мы забиваем на контроль для IO - например. Потому что "ну что там может случится?" :)
для State у нас есть удобные полу-контролируемые атомы и друзья.
для NPE - есть nill punning
для ошибок - есть "старые добрые" goto-стайл исключения...
И вот вопрос мой был примерно о том что:
Может стоит в клоуже где то таки добавить контроля с помощью монад? Может "мы сильно расслабились"?
Может nill punning таки недостаточно и лучше использовать Maybe?
А вместо "не структурных и не прослеживаемых" исключений использовать Either?
А может и еще что лучше на контроль поставить?
Будут ли монады достаточно эффективны учитывая то что клоуже динамически типизирован?
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment