模板 Haskell 解析类型别名

Template Haskell resolve type aliases

我正在使用模板 Haskell 生成有关类型的数据。出于多种原因,我需要将要使用的类型“规范化”。所以它不应该是 alias/synonym 类型。我真的不想禁止在构造中使用类型别名,因为使用的某些类型可能会变得很大。

所以现在我遇到了一个问题,当用户指定一个类型时,它与我期望的类型不匹配。例如,如果我有这个定义:

data MyData a = MyData Int

type Foo = MyData String Int Bool

serializeMyData :: TH.Type -> TH.Q [TH.Dec]
serializeMyData ty = ..

type Foo = MyData Int

后来我这样称呼它 serializeMyData

$(serializeMyData =<< [t| Foo |] )

然后在serializeMyData中会找到一个ConT Foo。这是正确的,因为用户指定了类型别名。但是对我来说没用。

所以我的问题是如何解析类型别名?

感谢任何帮助!

函数resolveTypeSynonyms :: TH.Type -> Q TH.Type can be found in the library th-abstraction.