Мне часто нужно сделать основную функцию, которая используется во многих местах, каким-то образом настраиваемой -, т. е. она может использовать либо алгоритм A, либо алгоритм B в зависимости от команды -линейный переключатель; или вывести дополнительную -подробную информацию на стандартный вывод, если каким-то образом установлен флаг «отладка».
Как реализовать такие глобальные флаги?
Я вижу 4 варианта, все они не очень хороши.
Чтение аргументов строки команды -из функции -плохо, потому что для этого нужна монада IO, а основные вычислительные функции все чисты, я не хочу получать IO там;
Передавать параметр из main/IO полностью в «листовую» функцию, которая должна изменить поведение -совершенно бесполезно, так как это означает изменение дюжины несвязанных функций в разных модулях для передачи этого параметра, и я хотите попробовать такие варианты конфигурации несколько раз, не меняя каждый раз код упаковки;
Используйте unsafePerformIO
, чтобы получить настоящую глобальную переменную. -кажется уродливым и излишним для такой простой проблемы;
Прямо в середине функции поместите код для обеих опций и закомментируйте одну из них. Или пусть функции выполняют _заполнение _A и выполняют _заполнение _B, и изменяют, какая из них вызывается, в зависимости от того, что говорит глобальная функция needDebugInfo=True
. Это то, что я делаю сейчас для debuginfo
, но его нельзя изменить без перекомпиляции, и это не должно быть лучшим доступным способом...
Мне не нужен и не нужен глобальный изменяемое состояние -Я хочу иметь простой глобальный флаг, который неизменялся бы во время выполнения, но каким-то образом мог бы быть установлен при запуске программы. Есть варианты?