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,但这也很麻烦.
有什么办法直接通过''报价直接得到我想要的东西?
''用于引用名称,而不是类型.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)
所以我担心你不能''用于你想做的事情.