У меня есть модуль , в котором создается и инициализируется глобальная среда (определяющая определенные ограничения, такие как соседние IP-адреса и т. д.), вызывая функцию инициализации. Ряд последующих функций должны использовать эти ограничения при вызове.
Хотя в принципе я понимаю, что делает монада читателя, я не совсем уверен, как я могу применить это к моей проблеме, особенно.
Как его можно использовать для инициализации среды, которая определяется пользователем и передается как данные/аргументы в функцию инициализации. Я имею в виду, что монада чтения должна откуда-то получить фактические значения, составляющие глобальную неизменную среду. Я хотел бы, чтобы значения считывались из вызова инициализирующей функции, например myinitial :: arg1 -> arg1 -> IOString
, где впоследствии arg1
и arg2
становятся глобальными неизменяемыми данные, доступные последующим функциям через монаду читателя (?)
Как я могу использовать эти значения среды в качестве аргументов функции, например recvFrom s arg1
, где arg1
— глобальные неизменяемые данные из моей среды. Или если arg2 > arg1, то ... иначе ...
Я мог бы, конечно, создать файл конфигурации, но я чувствую, что файл конфигурации отнимет большую гибкость.
[Редактировать] Я понимаю, что такое ask, но разве не должны быть дополнительные «бесточечные» способы, чтобы можно было опустить глобальную/средовую неизменяемость, если сигнатура функции была определена правильно? Как мне, например, нужно реорганизовать мой if-then-else, чтобы применить this.