Мне часто нужно сделать основную функцию, которая используется во многих местах, как-то конфигурируемая, то есть она может использовать либо алгоритм A, либо алгоритм B в зависимости от ключа командной строки; или распечатать дополнительную информацию в stdout, если флаг "debug" установлен каким-то образом.
Как реализовать такие глобальные флаги?
Я вижу 4 варианта, все они не очень хороши.
1) Прочитайте аргументы командной строки из функции - плохо, потому что для этого нужны мода IO и основные функции вычисления, все чисты, я не хочу получать там IO;
2) Передайте параметр от main/IO до конца до функции "leaf", которая должна изменить поведение - полностью непригодна для использования, так как это означает изменение десятка не связанных функций в разных модулях для передачи этого параметра, а я вы хотите попробовать такие параметры конфигурации несколько раз, не меняя каждый раз код упаковки;
3) Используйте unsafePerformIO, чтобы получить истинную глобальную переменную - чувствует себя уродливым и излишним для такой простой проблемы;
4) Прямо посередине функции есть код для обоих параметров и прокомментируйте один из них. Или имеют функции do_stuff_A и do_stuff_B и изменяете, какой из них вызывается, в зависимости от того, что говорит глобальная функция "нужнаDebugInfo = True". Это то, что я делаю сейчас для debuginfo, но его нельзя изменить без перекомпиляции, и это не должно быть наилучшим доступным способом...
Мне не нужно или требуется глобальное изменяемое состояние - я хочу иметь простой глобальный флаг, который неизменен во время выполнения, но может быть установлен как-то при запуске программы. Есть ли какие-либо варианты?