haskell - 如何将类型(来自 TemplateHaskell)转换为代理?
问题描述
我深陷于一些复杂的 TemplateHaskell 中,并且正在拼命寻找具有以下类型签名的函数:
Language.Haskell.TH.Type -> Data.Proxy.Proxy a
这样的事情存在吗?我可以理解,很难确定a
上面给出的 type-sig 中的类型,但是编译器是否无法查看里面的内容Type
并弄清楚a
应该是什么?
以下是我试图解决的整体问题的更多背景信息:我已经通过 TH “解构”了一个记录类型,其值为[Type]
,其中列表中的每个元素对应于记录中的一个字段。我需要将这些类型中的每一种传递给一个现有的函数,该函数只需要一个Proxy a
. 如果它使事情变得更容易,原始记录已经有一个实例Generic
解决方案
您需要一个函数,给定一个类型,为该类型生成一个表达式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]
, 并将它们应用到您的函数中。
推荐阅读
- php - 使用 PDO 从数据库中获取单个单元格
- java - 从公司名称中查找公司部门/行业
- sql - 我如何编写一个只需要一些特殊单词的触发器
- javascript - 智能电视和智能手机之间的点对点 (p2p) 连接
- php - 将值从 HTML 添加到 PHP
- ios - 使用 material.io 时通过 segue 链接按钮
- javascript - 状态改变后条件渲染不改变
- typescript - 打字稿:如果所有道具都是可选的,有没有办法不需要对象?
- xamarin.forms - Xamarin.Forms 中的 Html 到 PDF 转换
- android - Android Studio 正在 Android 设备上添加缓存版本