TemplateHaskell引用文档两个引号(''
)作为获取类型名称的方法:
> ''String
GHC.Base.String
这适用于此类型(名称)。但是,我无法找到一种方法使其适用于例如Maybe String
:
> ''Maybe String -- interprets String as a data constructor
> ''Maybe ''String -- wants to apply ''String to the Name type
我知道我可以通过使用[t| Maybe String |]
来解决问题,但这是在Q monad中,并且需要更改类型,我认为不会在相应时刻进行类型检查,只有在拼接时。
我也可以首先定义类型别名type MaybeString = Maybe String
,然后使用''MaybeString
,但这也很麻烦。
只需通过''
报价即可直接获得我想要的内容吗?
答案 0 :(得分:6)
''
用于引用名称,而不是类型。 Maybe
是一个名称,Maybe String
不是。因此,在引用该名称之前,必须通过定义类型别名来为类型命名,这并不足为奇。
[t| |]
引用 types 。请注意这里的区别。
Prelude> :t ''String
''String :: Language.Haskell.TH.Syntax.Name
Prelude> :t [t| String |]
[t| String |]
:: Language.Haskell.TH.Syntax.Q Language.Haskell.TH.Syntax.Type
所以我担心你不能使用''
来做你想做的事。
答案 1 :(得分:4)
我认为您正在寻找的是:
ConT ''Maybe `AppT` ConT ''String