生成包含类型族的 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) 的类型列表,然后是右侧的一个类型。
我正在写一个函数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) 的类型列表,然后是右侧的一个类型。