You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 06:48:24