Например:Как я могу связать контекст типа в объявлении экземпляра класса?
let context = sequence [classP (mkName "Eq") [varT (mkName "a")]]
in
[d| instance $(context) => Bar (Foo a) where
quux _ = undefined
|]
Результат, который я хочу instance Eq a => Bar (Foo a) where quux _ = undefined
, однако, Template Haskell жалуется, справедливо, что context
имеет тип Q Cxt
вместо ожидаемого Q Type
.
Есть ли способ указать ограничения объявления экземпляра без необходимости напрямую использовать конструктор InstanceD
?
Естественно, если TH ожидает TypeQ, вы должны дать ему TypeQ. Я думал, что вы сможете изменить 'context' на' conT '' Eq \ 'appT \' varT (mkName "a") '- это просто создает TypeQ. Однако, когда я пытаюсь скомпилировать его, я получаю сообщение об ошибке, которое я никогда не видел до этого момента: «Экзотический тип предиката (пока) не обрабатывается Template Haskell $ context'. Похоже, вам не повезло. – user2407038