Я написал несколько TemplateHaskell
, которые испускают правила перезаписи, но GHC (8.6.5) отклоняет мои правила со следующей ошибкой:
Rule "mapKWith/Pure":
Illegal expression: ((mapKWith @Pure) constraintProxy)
in left-hand side: ((mapKWith @Pure) constraintProxy) func
LHS must be of form (f e1 .. en) where f is not forall'd
Если я собираюсь с помощью -ddump-splices
и смотрю на правило, я вижу, что оно выглядит так (переформатировано):
{-# RULES "mapKWith/Pure"
forall
(constraintProxy :: Proxy constraint)
(func :: forall child. constraint child => Tree m child -> Tree n child).
((mapKWith @Pure) constraintProxy) func =
\case MkPure x -> MkPure (func x)
#-}
Если я скопирую это правило в свой код и отредактирую его, мне нужно только удалить избыточные скобки LHS для GHC, чтобы принять его (чтобы LHS стал mapKWith @Pure constraintProxy func
без скобок).
Есть ли способ выдать код из TH без лишних скобок, чтобы GHC принял его для LHS правила перезаписи? Есть ли другое решение или обходной путь?
Для контекста я пытаюсь сгенерировать эти правила, чтобы помочь встроенным функциям GHC, которые получают значения RankNTypes
, а код моей попытки доступен по адресу https://github.com/lamdu/syntax-tree/blob/rewrite-rules/src/AST/TH/Functor.hs#L31