生成包含类型族的 InstanceD 声明

Generate InstanceD declaration that contains type families

我正在写一个函数deriveMyTypeClass ::Q [Dec] 在这里,给定一个类型的名称,我遍历它的构造函数并实例化我根据结构编写的类型class。

我的类型 class 看起来像:

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 ...
            ]
   ]

感谢任何帮助:)

P.S。我使用的是 template-haskell-2.14.0.0 版本,但如果您的解决方案需要 2.15,那么我会考虑升级。

感谢约瑟夫对我的问题的评论,我找到了答案。以防万一有人偶然发现这个问题,带有类型族实例的类型类实例看起来像:

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

我最初对 Type 系列名称 (Foo) 和我为其实例化的类型 (tyName) 的组合方式感到困惑。这里它由类型系列名称组成,只是一个名称 (''Foo),一个用于实例化 Foo 的类型变量 (ConT tyName) 的类型列表,然后是右侧的一个类型。