从静态配置迁移到动态配置

has*_*ell 6 haskell configuration-files

我正在开发一个haskell项目,其中设置当前在一个名为的文件中Setting.hs,因此它们在编译期间被检查并可以全局访问.

但是,由于这有点太静态,我正在考虑在运行时读取配置.代码库是巨大的,似乎将相当大的努力传递给整个程序流程中的参数,例如作为参数,因为它们可以从任何地方任意访问.

是否有任何设计模式,库甚至ghc扩展可以在不重构整个代码的情况下提供帮助?

mb1*_*b14 0

您要问的是,如果可能会破坏引用透明度,至少对于纯函数而言(纯函数结果可以依赖于某些全局变量,但不能依赖于配置文件,不是吗)?

通常人们通过 Monad 将配置作为数据隐式传递来避免这种情况。或者(如果您愿意稍微重构一下代码),您可以使用隐式参数 extenson,理论上它是为了解决此类问题,但实际上并不起作用。但是,如果您确实需要,您可以使用unsafePerformIOioRef来获得顶级可变状态,这是肮脏且皱眉的厄普顿。您需要一个顶级可变状态,因为您需要能够在加载初始配置时修改“变异”。

然后你会得到这样的东西:

myGlobalVar :: IORef Int
{-# NOINLINE myGlobalVar #-}
myGlobalVar = unsafePerformIO (newIORef 17)
Run Code Online (Sandbox Code Playgroud)