我经常需要使在许多地方使用的核心功能以某种方式可配置 - 即,它可以使用算法 A 或算法 B,具体取决于命令行开关;或者如果以某种方式设置了“调试”标志,则让它将额外的详细信息打印到标准输出。
我应该如何实现这样的全局标志?
我看到了 4 个选项,它们都不是很好。
从函数中读取命令行参数 - 不好,因为这需要 IO monad 并且核心计算函数都是纯的,我不想在那里获取 IO;
将参数从 main/IO 一直传递到需要更改行为的“叶”函数 - 完全无法使用,因为这意味着更改不同模块中的十几个不相关的函数来传递此参数,我想尝试这样多次配置选项,无需每次更改包装代码;
用于
unsafePerformIO
获取真正的全局变量 - 对于这样一个简单的问题,感觉很丑陋和矫枉过正;在函数的中间有两个选项的代码并将其中一个注释掉。或者具有函数 do_stuff_A 和 do_stuff_B,并根据全局函数的内容更改调用其中的哪一个
needDebugInfo=True
。这就是我现在正在为debuginfo
.
我不需要也不想要全局可变状态——我想要一个简单的全局标志,它在运行时不可变,但可以在程序启动时以某种方式设置。有什么选择吗?