如何为Haskell重写规则添加类型类约束?
带类型类约束的GHC重写规则语法疑问
此前已有若干关于带类型类约束的重写规则的问题,但它们均涉及高阶多态。本文场景更为“常规”:无高阶类型,且左侧类型本应已满足所需的类型类约束。
给出的代码示例如下:
class C a where op :: a -> a newtype Foo tag w = Foo{ runFoo :: w } instance (Monoid w) => C (Foo tag w) where op = id opSpecial :: (Monoid w) => Foo () w -> Foo () w opSpecial _ = Foo mempty {-# RULES "op/special" forall w. forall. op @(Foo () w) = opSpecial #-}
(这是极简示例,可认为opSpecial与通用op外延等价但性能更优)
该重写规则类型检查失败,报错信息如下:
rewrite-context.hs:13:55: error: [GHC-39999] • Could not deduce ‘Monoid w’ arising from a use of ‘opSpecial’ from the context: C (Foo () w) bound by the RULE "op/special" at rewrite-context.hs:13:7-63 Possible fix: add (Monoid w) to the context of the RULE "op/special" • In the expression: opSpecial When checking the rewrite rule "op/special" | 13 | "op/special" forall w. forall. op @(Foo () w) = opSpecial
需注意,Monoid w已是多态实例forall w. C (Foo tag w)的约束,因此op @(Foo () w)的每次调用本应都满足该约束。但即便存在可能的重叠/非一致实例,**如何为重写规则添加该约束的语法是什么?**GHC手册中关于重写规则的章节并未提及相关方法。
内容的提问来源于stack exchange,提问作者Cactus
相关产品推荐
相关产品推荐

