Что (если есть) является общепринятым способом минимизировать влияние монады ввода-вывода на мой код - PullRequest
4 голосов
/ 10 июля 2020

Я немного борюсь с IO Monad. (по-прежнему очень хорошо учится)

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

timeZoneSeconds = liftA (60*) $ liftA timeZoneMinutes getCurrentTimeZone

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

Итак, в основном я вижу, как весь мой чистый код превращается в код с ошибками ввода-вывода.

Во всех материалах didacti c, которые я видел, большинство объяснений монады ввода-вывода имеют общий вид «читать материал, затем писать материал», без особых «вычислений».

Есть ли рекомендуемый способ минимизировать влияние этого?

Следует ли мне переопределить все операторы, которые мне нужны для использования liftA «под прикрытием»?

Или мне просто следует продолжить?

1 Ответ

5 голосов
/ 10 июля 2020

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

main = do
  env <- lookupEnv "ENV"
  tz <- getCurrentTimeZone
  let result = pureCode env tz
  putStr result

Ваша функция pureCode не имеет любой IO прилагается.

...