gpt4 book ai didi

haskell - 从静态配置到动态配置

转载 作者:行者123 更新时间:2023-12-04 15:21:31 26 4
gpt4 key购买 nike

我正在处理一个 haskell 项目,其中的设置当前位于一个名为 Setting.hs 的文件中。 ,所以它们在编译时被检查并且可以被全局访问。

但是,由于这有点过于静态,我正在考虑在运行时读取配置。代码库很大,通过设置似乎需要相当大的努力,例如作为整个程序流程的参数,因为它们可以从任何地方任意访问。

是否有任何设计模式、库甚至 ghc 扩展可以在这里提供帮助而无需重构整个代码?

最佳答案

感谢您的提示!我想出了一个最小的例子,它展示了我将如何使用 reflection包裹:

{-# LANGUAGE Rank2Types, FlexibleContexts, UndecidableInstances #-}

import Data.Reflection

data GlobalConfig = MkGlobalConfig {
getVal1 :: Int
, getVal2 :: Double
, getVal3 :: String
}

main :: IO ()
main = do
let config = MkGlobalConfig 1 2.0 "test"
-- initialize the program flow via 'give'
print $ give config (doSomething 2)
-- this works too, the type is properly inferred
print $ give config (3 + 3)
-- and this as well
print $ give config (addInt 7 3)

-- We need the Given constraint, because we call 'somethingElse', which finally
-- calls 'given' to retrieve the configuration. So it has to be propagated up
-- the program flow.
doSomething :: (Given GlobalConfig) => Int -> Int
doSomething = somethingElse "abc"

-- since we call 'given' inside the function to retrieve the configuration,
-- we need the Given constraint
somethingElse :: (Given GlobalConfig) => String -> Int -> Int
somethingElse str x
| str == "something" = x + getVal1 given
| getVal3 given == "test" = 0 + getVal1 given
| otherwise = round (fromIntegral x * getVal2 given)

-- no need for Given constraint here, since this does not use 'given'
-- or any other functions that would
addInt :: Int -> Int -> Int
addInt = (+)
Given类更容易使用并且非常适合全局配置模型。所有不使用 given 的函数(获取值)似乎不需要类约束。这意味着我只需要更改实际访问全局配置的函数。

这就是我一直在寻找的。

关于haskell - 从静态配置到动态配置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30140175/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com