模板Haskell类型引用问题

时间:2011-09-20 17:17:18

标签: haskell template-haskell

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,但这也很麻烦。

只需通过''报价即可直接获得我想要的内容吗?

2 个答案:

答案 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