6

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

我知道我可以通过 using 来解决[t| Maybe String |]问题,但这在 Q monad 中,并且需要更改类型,而且我认为只有在拼接时才在相应的时刻进行类型检查。

我也可以先定义一个类型别名,type MaybeString = Maybe String然后使用''MaybeString,但这也很麻烦。

''有什么方法可以通过报价直接得到我想要的东西?

4

2 回答 2

6

''用于引用名称,而不是类型。Maybe是一个名字,Maybe String不是。因此,在引用该名称之前,您必须通过定义类型别名来为您的类型命名,这并不奇怪。

[t| |]另一方面,引号类型。注意这里的区别。

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

所以我担心你不能用''你想做的事。

于 2011-09-20T17:34:26.753 回答
4

我认为您正在寻找的是:

ConT ''Maybe `AppT` ConT ''String
于 2011-09-20T19:30:06.897 回答