您是否可以说每次使用字段而不重复使用哪个Haskell记录实例?

时间:2015-03-12 18:51:34

标签: haskell

我最近创建了一个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

我有什么方法可以说"当我引用这些记录字段时,它们都适用于这个实例"在一段代码中,而不是每次都要重复它?我记得过去经历过这样的事情,但现在找不到,我可能错了。

2 个答案:

答案 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

虽然那当然不会短得多。