【问题标题】:How to convert a Type (from TemplateHaskell) to a Proxy?如何将类型(来自 TemplateHaskell)转换为代理?
【发布时间】:2018-10-24 06:35:08
【问题描述】:

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

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

这样的东西存在吗?我可以理解在上面给出的 type-sig 中很难确定类型 a,但是编译器无法查看 Type 内部的内容并找出 a 应该是什么?

这里是我试图解决的整体问题的更多背景信息:我已经通过 TH “解构”了一个记录类型,其值为 [Type],其中列表中的每个元素对应一个字段在记录中。我需要将这些类型中的每一个传递给一个现有的函数,该函数只需要一个Proxy a。如果它使事情变得更容易,原始记录已经有一个Generic的实例

【问题讨论】:

  • 这个函数没办法写。 Haskell 不支持依赖类型。

标签: haskell template-haskell


【解决方案1】:

您想要一个函数,在给定类型的情况下,为该类型的Proxy 生成表达式

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

例如

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-05-17
    • 2011-04-06
    • 2017-01-11
    • 2022-01-22
    • 2016-03-20
    • 1970-01-01
    • 2023-02-08
    • 1970-01-01
    相关资源
    最近更新 更多