Создать объявление InstanceD, которое содержит семейства типов - PullRequest
1 голос
/ 15 января 2020

Я пишу функцию deriveMyTypeClass ::Q [Dec], где, учитывая имя типа, я обхожу его конструкторы и создаю экземпляр класса типов, который я написал на основе структуры.

Мой класс типов выглядит следующим образом:

class MyTypeclass a where
  type Foo a
  f :: a -> a -> Foo a 
  g :: Foo a -> a -> a 

В моей функции deriveMyTypeclass какое объявление я должен передать InstanceD, чтобы удовлетворить объявление семейства типов. Будет ли это TySynInstD?

Сейчас у меня есть что-то вроде:

deriveMyTypeclass :: Name -> Q [Dec] 
deriveMyTypeclass tyName = do 
... blah blah blah reify tyName ...
return $ [
  InstanceD Nothing [] 
            (AppT (ConT ''MyTypeclass) (ConT tyName) 
            [ -- declarations go here
            , TySynInstD $ ????? 
            , FunD 'f ... 
            , FunD 'g ...
            ]
   ]

Любая помощь приветствуется :)

PS Я использую версию template- haskell -2.14.0.0, но если для вашего решения требуется 2.15, я рассмотрю вопрос об обновлении.

1 Ответ

0 голосов
/ 17 января 2020

Благодаря комментарию Джозефа к моему вопросу я нашел свой ответ. На всякий случай, если кто-нибудь наткнется на этот вопрос, экземпляр класса типов с экземпляром семейства типов будет выглядеть так:

InstanceD Nothing [] 
         (AppT (ConT ''MyTypeclass) (ConT tyName)) 
         [TySynInstD ''Foo 
                     (TySynEqn [ConT tyName] {{THE RIGHT HANDSIDE TYPE HERE}})
         , FunD ....
         , .....
         ] 

Я был изначально смущен тем, как имя семейства типов (Foo) и тип, который я копировал это для (tyName) будет составлено. Здесь оно составлено как имя семейства типов как просто имя ('' Foo), список типов для создания экземпляра переменной типа Foo (ConT tyName) и затем тип для правой части.

...