我最近创建了一个Config
记录类型,其中包含在整个应用程序中使用的数据/函数。例如,让我们说它
data Config m u = Config
{ issuer :: Text
, loadUser :: LoadUser m u
, authenticate :: Authenticate m
}
我还有另一个从配置中实际创建应用程序的函数:
buildServer :: Config -> m Server
buildServer cfg = ...
现在,每次我使用这些记录字段时,我都必须将它们明确地应用到cfg
以获得我想要的内容:
let someFunction = doSomething (issuer cfg) (loadUser cfg) (authenticate cfg)
以前我只是在相同的范围内创建函数(没有配置数据类型),所以这只是:
let someFunction = doSomething issuer loadUser authenticate
我有什么方法可以说"当我引用这些记录字段时,它们都适用于这个实例"在一段代码中,而不是每次都要重复它?我记得过去经历过这样的事情,但现在找不到,我可能错了。
答案 0 :(得分:12)
是的,RecordWildCards
扩展程序:
buildServer (Config {..}) =
let someFunction = doSomething issuer loadUser authenticate
in undefined
答案 1 :(得分:7)
如果没有任何语法扩展,您只需使用函数箭头的Applicative
实例即可获得类似效果:
someFunction = doSomething <$>
issuer <*>
loadUser <*>
authenticate $ cfg
-- or
someFunction' = liftA3 doSomething issuer loadUser authenticate cfg
虽然那当然不会短得多。