Я немного борюсь с IO Monad. (по-прежнему очень хорошо учится)
Я считаю, что понимаю веские причины для отделения «ввода-вывода» от чисто функционального кода, но это, похоже, делает мой код намного более сложным при использовании атрибутов часов и среды. Вот пример (связанный с часами):
timeZoneSeconds = liftA (60*) $ liftA timeZoneMinutes getCurrentTimeZone
Теперь у меня есть много других вещей, связанных с timeZoneSeconds - добавление, вычитание, сравнение - в другом месте программы, и поскольку timeZoneSeconds взаимодействует с другими бит, практически все, с чем я имею дело, превращается в «ввод-вывод» и, таким образом, наполняет мой код лифтами.
Итак, в основном я вижу, как весь мой чистый код превращается в код с ошибками ввода-вывода.
Во всех материалах didacti c, которые я видел, большинство объяснений монады ввода-вывода имеют общий вид «читать материал, затем писать материал», без особых «вычислений».
Есть ли рекомендуемый способ минимизировать влияние этого?
Следует ли мне переопределить все операторы, которые мне нужны для использования liftA «под прикрытием»?
Или мне просто следует продолжить?