首页 > 解决方案 > 如何将类型(来自 TemplateHaskell)转换为代理?

问题描述

我深陷于一些复杂的 TemplateHaskell 中,并且正在拼命寻找具有以下类型签名的函数:

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

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

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

标签: haskelltemplate-haskell

解决方案


您需要一个函数,给定一个类型,为该类型生成一个表达式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], 并将它们应用到您的函数中。


推荐阅读