Ответ 1
Документация Template Haskell содержит сведения о том, что вам разрешено сращивать.
Склеивание может происходить вместо
- выражение; выражение сплайсинга должно иметь тип
Q Exp
- тип; выражение сплайсинга должно иметь тип
Q Typ
- список объявлений верхнего уровня; выражение сплайсинга должно иметь тип
Q [Dec]
В обоих случаях $n
, однако, вы пытаетесь соединить имя.
Это означает, что вы не можете сделать это, используя цитаты и сращивания. Вам нужно будет создать объявление, используя различные комбайнаторы, доступные в модуле Language.Haskell.TH
.
Я думаю, что это должно быть эквивалентно тому, что вы пытаетесь сделать.
genData :: Name -> Q [Dec]
genData n = fmap (:[]) $ dataD (cxt []) n []
[normalC n [strictType notStrict [t| Integer |]]] []
Да, это немного уродливо, но ты туда. Чтобы использовать это, вызовите его со свежим именем, например.
$(genData (mkName "Z5"))