Я использую шаблон Haskell для генерации данных о типе. По многим причинам мне нужно, чтобы используемый тип был "нормализован". Так что это не должен быть псевдоним/синоним типа. Я действительно не хочу запрещать использование псевдонимов типов в конструкции, поскольку некоторые используемые типы могут стать огромными.
Итак, теперь у меня проблема: когда пользователь указывает тип, он не соответствует типу, который я ожидаю. Например, если у меня есть это определение:
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 можно найти в библиотеке th-абстракция.