使用模板Haskell获取类型信息

使用模板Haskell获取类型信息,haskell,template-haskell,type-level-computation,Haskell,Template Haskell,Type Level Computation,我目前正在开发一个库,该库允许用户指定命令规范列表,如下所示: data CommandDef=forall(as::[*])。可键入为=>CommandDef{ argTypes::代理为, commandName::String, commandStrings::[String], 解析器::HList(FMap CommandParser as), 描述::可能是字符串 } 然后,可以将此命令规范列表传递到模板haskell函数genCommands::[CommandDef]->Q[D

我目前正在开发一个库,该库允许用户指定命令规范列表,如下所示:

data CommandDef=forall(as::[*])。可键入为=>CommandDef{
argTypes::代理为,
commandName::String,
commandStrings::[String],
解析器::HList(FMap CommandParser as),
描述::可能是字符串
}
然后,可以将此命令规范列表传递到模板haskell函数
genCommands::[CommandDef]->Q[Dec]
,以生成表示用户指定的不同命令类型的
命令
数据类型,以及函数
parseCommands::String->Maybe command
,其中,
argTypes
指定要分析的命令参数的类型,
parsers
是给定
argTypes
的相关解析器列表

问题是,我需要以某种方式获得一个
类型
(来自Language.Haskell.TH)对于
CommandDef
中的每个
argTypes
,以使用模板Haskell正确生成
命令
类型,同时保持类型安全,确保所有
解析器
都是适当的类型。(其思想是,如果
commandName=“commandName
argTypes=Proxy@'[ArgType1,ArgType2]
,则将在
命令中生成形式为
commandName ArgType1 ArgType2
的构造函数。)

所以,实际上,在一个理想的世界中,我想要的是一个函数
代理as->Q[Type]
,或者类似的东西,但我不确定在模板Haskell中是否可以这样做

有这样的事情吗?或者有没有任何方法可以修改我的方法,以便用模板Haskell实现所有相同的目标


我考虑过添加一个冗余字段
argTypesTH::[Name]
包含
argTypes
中所有类型的名称,但我甚至不确定这是如何工作的,因为我似乎找不到一个模板haskell函数,该函数采用类型名称,并返回所需的
类型
,该类型需要为我的
命令
类型的构造函数指定。(有
reifyType
,但我不确定它是否能满足我的要求,因为它取一个值的名称并返回一个类型)

我不认为你能从
*
变成haskell
类型的模板。我认为你需要在
CommandDef
中包含
类型
。你能在
CommandDef
生成时做这件事吗?
让ty=[t|'[ArgType1,ArgType2]]在CommandDef{argTypes=Proxy@($ty),argTypesTH=ty}
工作?@JosephSible:可能,我会试试。我不知道如何处理[t|…|]返回
Q类型而不是
类型的事实。我想我可以让
genCommands
接受
Q[CommandDef]
作为参数。由于我的解决方案不使用
具体化
,如果您手头有
IO
的话,您总是可以
运行它。