Maneira correta de tratar bandeiras globais em Haskell

Muitas vezes eu preciso fazer uma função principal que é usada em muitos lugares de alguma forma configurável - ou seja, pode usar o algoritmo A ou o algoritmo B dependendo de um switch de linha de comando; ou ter que imprimir informações extra-detalhadas para stdout se um sinalizador 'debug' estiver configurado de alguma forma.

Como devo implementar essas bandeiras globais?

Eu vejo 4 opções, todas elas não são muito boas.

Leia os argumentos de linha de comando da função - ruim, porque isso precisa de uma IO mônada e as funções de cálculo do núcleo são todas puras, não quero que o IO fique lá;

Passe um parâmetro de main / IO até a função 'leaf' que precisa mudar o comportamento - completamente inutilizável, pois isso significa alterar uma dúzia de funções não relacionadas em módulos diferentes para passar esse parâmetro, e eu quero experimentar opções de configuração várias vezes sem alterar o código de quebra automática sempre;

UsarunsafePerformIO obter uma variável global verdadeira - parece feio e exagerado para um problema tão simples;

Bem no meio da função temos código para ambas as opções e comentamos uma delas. Ou tem funções do_stuff_A e do_stuff_B, e muda qual delas é chamada dependendo do que é uma função globalneedDebugInfo=True diz. É o que estou fazendo agora para odebuginfo, mas não pode ser alterado sem recompilar, e não deve ser realmente o melhor caminho disponível ...

Eu não preciso ou quero um estado mutável global - eu quero ter uma bandeira global simples que seja imutável em tempo de execução, mas que possa ser de alguma forma definida quando o programa for iniciado. Existem algumas opções?

questionAnswers(4)

yourAnswerToTheQuestion