haskelltemplate-haskell

Template Haskell resolve type aliases


I'm using template Haskell to generate data about a type. For many reasons I need the type to be used to be "normalized". So it shouldn't be a type alias/synonym. I really don't want to disallow using type aliases in the construct since some types that are used can become huge.

So now I have the problem that when a user specifies a type it doesn't match the type I expect. For example if I have this definition:

data MyData a = MyData Int

type Foo = MyData String Int Bool

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

type Foo = MyData Int

And then later in I call this serializeMyData like this:

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

Then in the serializeMyData it will find a ConT Foo. This is correct since the user has specified the type alias. But is not useable for me.

So my question is how can I resolve type aliases?

Any help is appreciated!


Solution

  • The function resolveTypeSynonyms :: TH.Type -> Q TH.Type can be found in the library th-abstraction.