Правильный способ обработки глобальных флагов в Haskell

Мне часто нужно сделать основную функцию, которая используется во многих местах, каким-то образом настраиваемой -, т. е. она может использовать либо алгоритм A, либо алгоритм B в зависимости от команды -линейный переключатель; или вывести дополнительную -подробную информацию на стандартный вывод, если каким-то образом установлен флаг «отладка».

Как реализовать такие глобальные флаги?

Я вижу 4 варианта, все они не очень хороши.

  1. Чтение аргументов строки команды -из функции -плохо, потому что для этого нужна монада IO, а основные вычислительные функции все чисты, я не хочу получать IO там;

  2. Передавать параметр из main/IO полностью в «листовую» функцию, которая должна изменить поведение -совершенно бесполезно, так как это означает изменение дюжины несвязанных функций в разных модулях для передачи этого параметра, и я хотите попробовать такие варианты конфигурации несколько раз, не меняя каждый раз код упаковки;

  3. Используйте unsafePerformIO, чтобы получить настоящую глобальную переменную. -кажется уродливым и излишним для такой простой проблемы;

  4. Прямо в середине функции поместите код для обеих опций и закомментируйте одну из них. Или пусть функции выполняют _заполнение _A и выполняют _заполнение _B, и изменяют, какая из них вызывается, в зависимости от того, что говорит глобальная функция needDebugInfo=True. Это то, что я делаю сейчас для debuginfo, но его нельзя изменить без перекомпиляции, и это не должно быть лучшим доступным способом...

Мне не нужен и не нужен глобальный изменяемое состояние -Я хочу иметь простой глобальный флаг, который неизменялся бы во время выполнения, но каким-то образом мог бы быть установлен при запуске программы. Есть варианты?

14
задан Machavity 28 November 2018 в 16:37
поделиться