Как преобразовать тип (из TemplateHaskell) в прокси? - PullRequest
0 голосов
/ 24 октября 2018

Я в глубине души в каком-то сложном TemplateHaskell и отчаянно ищу функцию со следующей сигнатурой типа:

Language.Haskell.TH.Type -> Data.Proxy.Proxy a

Существует ли что-то подобное?Я могу оценить, что было бы трудно определить тип a в приведенном выше type-sig, но нет ли способа, чтобы компилятор мог посмотреть на то, что находится внутри Type, и выяснить, что a должно быть?

Вот еще один контекст общей проблемы, которую я пытаюсь решить: я "деструктурировал" тип записи через TH и имел значение [Type], где каждый элемент в спискесоответствует полю в записи.Мне нужно передать каждый из этих типов в существующую функцию, которая принимает только Proxy a.Если это облегчает задачу, исходная запись уже имеет экземпляр Generic

1 Ответ

0 голосов
/ 25 октября 2018

Требуется функция, которая для данного типа создает выражение для Proxy для этого типа.

proxyFor :: Type -> Exp
proxyFor = SigE (ConE 'Proxy) . AppT (ConT ''Proxy)

например,

ghci> let x = $(return $ proxyFor (ConT ''Int)) in x
Proxy

Вы можете map proxyFor над [Type], получить [Exp] и применить их к своей функции.

...