【问题标题】:Generate InstanceD declaration that contains type families生成包含类型族的 InstanceD 声明
【发布时间】:2020-01-18 02:13:03
【问题描述】:

我正在写一个函数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 ...
            ]
   ]

任何帮助表示赞赏:)

附:我正在使用版本 template-haskell-2.14.0.0 但如果您的解决方案需要 2.15,那么我会考虑升级。

【问题讨论】:

  • 您是否尝试过手写一个实例并将其粘贴到[d| 以查看它如何转换为 TH?
  • 我没有,但这是个好主意。谢谢!

标签: haskell metaprogramming template-haskell type-families


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-29
    • 2020-03-19
    • 2020-10-05
    • 2023-01-11
    • 2016-06-18
    相关资源
    最近更新 更多