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

时间:2018-10-24 06:35:09

标签: haskell template-haskell

我陷入了复杂的TemplateHaskell的深渊,并拼命寻找具有以下类型签名的函数:

items.stream().foreach(System.out::println);

是否存在类似的东西?我可以理解,很难在上面给出的类型签名中确定类型Language.Haskell.TH.Type -> Data.Proxy.Proxy a ,但是编译器无法查看a内部的内容并找出{ {1}}应该是?

这里是我要解决的整体问题的更多上下文:我已经通过TH对记录类型进行“解构”,其值为Type,其中列表中的每个元素对应于记录中的一个字段。我需要将这些类型中的每一个传递给仅使用a的现有函数。如果使事情变得简单,则原始记录已经有一个[Type]

的实例。

1 个答案:

答案 0 :(得分:1)

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

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

例如

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

您可以在mapproxyFor [Type],得到一个[Exp],并将其应用于您的函数。