Существуют ли веские причины для построения стеков монадных трансформаторов поверх IO? - PullRequest
0 голосов
/ 29 сентября 2018

IO сложно в Хаскеле.Потоки, FFI, асинхронные исключения, лень, вы называете это.

И затем у нас есть MonadIO, который позволяет наложить монадические стеки с IO внизу.Поскольку IO действия могут делать произвольные вещи, какова ценность построения монадических стеков поверх таких шатких основ?

Почему это существует?Почему бы не создать собственную монаду IO, если вам действительно нужно выполнить произвольные побочные эффекты?

Ответы [ 3 ]

0 голосов
/ 30 сентября 2018

Какова ценность построения монадических стеков на основе таких шатких оснований?

Трансформаторы поверх IO могут позволить вам более удобно говорить о последовательностях повторяющихся действий (следовательно, различные потоковые библиотеки ).

Они также могут помочь в ведении требуемого учета внешних ресурсов .

«дикость» IO не является общим возражением против размещения на ней трансформаторов, так как они могут помочь вам избежать повторяющегося кода и сделать более понятную логику.

Скорее,аргумент заключается в том, что IO уже предоставляет некоторые встроенные функции для обработки ошибок ( исключения ) и изменяемых ссылок (IORef s, MVars ...) поэтому добавление преобразователей для этой уже существующей функциональности может оказаться излишним.

Одним из аргументов для изменяемых ссылок, в частности, является то, что состояние, поддерживаемое "чистым", означает исчезновениеЕсли возникает всплывающее исключение, это может быть не тем, что вы хотите.Вы также можете получить доступ к изменяемым ссылкам из нескольких потоков.

0 голосов
/ 30 сентября 2018

MonadIO может быть полезно при реализации функций для типа, который не экземпляр MonadIO.

newtype FooMonad a
  = FooMonad (StateT Int IO a)
  deriving (Functor, Applicative, Monad)

doFoo :: FooMonad String
doFoo = FooMonad $ liftIO getLine

Вы можете использовать MonadIO экземпляры StateT Int и IO для удобного определения «примитивных» действий FooMonad.Другие, использующие ваш модуль, ограничены только примитивами, которые вы выбираете для экспорта.

0 голосов
/ 30 сентября 2018

В наши дни обычно используется шаблон проектирования ReaderT .

Вы правы, опасаясь ставить другие преобразователи поверх ввода-вывода, и в приведенном выше сообщении в блоге объясняетсянекоторые из этих причин.

Тем не менее, ReaderT обеспечивает приятное небольшое удобство, когда речь идет о передаче "общей конфигурации приложения" всем вашим функциям.

...