模板Haskell类型引用问题

ius*_*tin 6 haskell template-haskell

TemplateHaskell引用文档两个quotes('')作为获取类型名称的方法:

> ''String
GHC.Base.String
Run Code Online (Sandbox Code Playgroud)

这适用于此类型(名称).但是,我找不到一种方法让它适用于例如Maybe String:

> ''Maybe String -- interprets String as a data constructor
> ''Maybe ''String -- wants to apply ''String to the Name type
Run Code Online (Sandbox Code Playgroud)

我知道我可以通过使用来解决[t| Maybe String |],但是这是在Q monad中,并且需要更改类型,并且我认为不会在相应的时刻进行类型检查,只有在拼接时.

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

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

ham*_*mar 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
Run Code Online (Sandbox Code Playgroud)

所以我担心你不能''用于你想做的事情.