Так что то, что имеет тенденцию быть довольно
глобальный как журнал или конфигурация,
вы бы предложили поставить в IO
монада? Смотря на (по общему признанию
очень ограниченный набор) примеров, я прихожу
думать, что код на Haskell имеет тенденцию быть
либо чистый (т.е. совсем не монадический)
или в монаде IO. Или это
заблуждение?
Я думаю, что это заблуждение, только монада IO не чиста. такие монады, как Write / T / Reader / T / State / T / ST, все еще чисто функциональны. Вы можете написать чистую функцию, которая использует любую из этих монад внутри, как этот абсолютно бесполезный пример:
foo :: Int -> Int
foo seed = flip execState seed $ do
modify $ (+) 3
modify $ (+) 4
modify $ (-) 2
Все, что это делает, - это неявное выполнение потоков / верстка состояния, то, что вы бы делали сами вручную, нотация здесь просто дает вам хороший синтаксический сахар, чтобы он выглядел обязательным. Вы не можете выполнять какие-либо действия ввода-вывода здесь, вы не можете вызывать какие-либо посторонние функции. Монада ST позволяет вам иметь реальные изменяемые ссылки в локальной области, имея чистый интерфейс функций, и вы не можете выполнять какие-либо действия ввода-вывода, там все еще чисто функционально.
Вы не можете избежать некоторых действий ввода-вывода, но вы не хотите возвращаться к вводу-выводу для всего, потому что это то, куда все может пойти, ракеты могут быть запущены, у вас нет контроля. У Haskell есть абстракции для управления эффективными вычислениями с различной степенью безопасности / чистоты, монада ввода-вывода должна быть последним средством (но вы не можете избежать этого полностью).
В вашем примере я думаю, что вы должны придерживаться монадных преобразователей или монады, изготовленной на заказ, которая делает то же самое, что и их составление с помощью преобразователей. Я никогда не писал собственную монаду (пока), но я довольно часто использовал монадные преобразователи (мой собственный код, а не на работе), не волнуйтесь о них так много, используйте их, и это не так плохо, как вы думаете .
Вы видели главу из Real World Haskell , в которой используются монадные трансформаторы ?