代码之家  ›  专栏  ›  技术社区  ›  Saurabh Nanda

如何将类型(从TemplateHaskell)转换为代理?

  •  1
  • Saurabh Nanda  · 技术社区  · 6 年前

    我对一些复杂的TemplateHaskell非常感兴趣,正在拼命寻找一个具有以下类型签名的函数:

    Language.Haskell.TH.Type -> Data.Proxy.Proxy a
    

    像这样的东西存在吗?我很感激很难确定类型 a 在上面给出的sig类型中,但编译器是否无法查看其中的内容 Type 弄清楚 应该是?

    下面是我试图解决的总体问题的更多上下文:我已经通过TH“去结构化”了一个记录类型,其值为 [Type] ,其中列表中的每个元素对应于记录中的一个字段。我需要将这些类型中的每一个传递给只占用一个函数的现有函数。 Proxy a . 如果这样做更容易,那么原始记录已经有一个 Generic

    1 回复  |  直到 6 年前
        1
  •  1
  •   HTNW    6 年前

    你想要一个函数,给定一个类型,产生 表情 为了一个 Proxy 对于那种类型。

    proxyFor :: Type -> Exp
    proxyFor = SigE (ConE 'Proxy) . AppT (ConT ''Proxy)
    

    例如

    ghci> let x = $(return $ proxyFor (ConT ''Int)) in x
    Proxy
    

    你可以 map proxyFor 超过你的 [Type] ,获取 [Exp] ,并将它们应用到您的函数中。

    推荐文章