Глобальные переменные и монада чтения

У меня есть модуль , в котором создается и инициализируется глобальная среда (определяющая определенные ограничения, такие как соседние IP-адреса и т. д.), вызывая функцию инициализации. Ряд последующих функций должны использовать эти ограничения при вызове.

Хотя в принципе я понимаю, что делает монада читателя, я не совсем уверен, как я могу применить это к моей проблеме, особенно.

  • Как его можно использовать для инициализации среды, которая определяется пользователем и передается как данные/аргументы в функцию инициализации. Я имею в виду, что монада чтения должна откуда-то получить фактические значения, составляющие глобальную неизменную среду. Я хотел бы, чтобы значения считывались из вызова инициализирующей функции, например myinitial :: arg1 -> arg1 -> IOString , где впоследствии arg1 и arg2 становятся глобальными неизменяемыми данные, доступные последующим функциям через монаду читателя (?)

  • Как я могу использовать эти значения среды в качестве аргументов функции, например recvFrom s arg1, где arg1— глобальные неизменяемые данные из моей среды. Или если arg2 > arg1, то ... иначе ...

Я мог бы, конечно, создать файл конфигурации, но я чувствую, что файл конфигурации отнимет большую гибкость.

[Редактировать] Я понимаю, что такое ask, но разве не должны быть дополнительные «бесточечные» способы, чтобы можно было опустить глобальную/средовую неизменяемость, если сигнатура функции была определена правильно? Как мне, например, нужно реорганизовать мой if-then-else, чтобы применить this.

5
задан J Fritsch 13 June 2012 в 13:29
поделиться