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

多参数类型类中引用推断类型的问题求助

解决Haskell幻影类型类实例中的约束缺失问题

你的问题核心在于:DdT Z a b实例中使用bot和top时,GHC无法确认对应类型组合的DdTFS Z a b实例是否存在——当前DdT类没有对DdTFS的约束,编译器无法推断出a和b对应的实例必然存在。

直接解决方案:添加类型约束

有两种方式可以解决这个问题:

方式1:给DdT类全局添加DdTFS约束

如果所有DdT实例都需要依赖对应的DdTFS实例,可以修改DdT类的定义,把DdTFS作为超类:

-- 修改DdT类,指定DdTFS为超类
class DdTFS a b c => DdT a b c where
    neg :: Dd a b c -> Dd a b c

-- 之后的实例定义可以简化,无需额外约束
instance DdT B a b where
  neg (ToDd b) = ToDd $ Cudd.cuddNot b

instance DdT Z a b where
  neg (ToDd z) = ToDd $ Cudd.ifthenelse (ToDd z) bot top

方式2:仅给Z的DdT实例添加约束

如果不需要所有DdT实例都依赖DdTFS,可以单独给Z的实例加上约束:

-- 保持原DdT类定义不变
class DdT a b c where
    neg :: Dd a b c -> Dd a b c

-- 给Z的DdT实例添加DdTFS约束
instance DdTFS Z a b => DdT Z a b where
  neg (ToDd z) = ToDd $ Cudd.ifthenelse (ToDd z) bot top

为什么之前的写法无效?

你尝试的asTypeOf写法本质上没有解决核心问题:编译器仍然不知道DdTFS Z a b实例是否存在。添加约束后,相当于告诉GHC:只有当对应的DdTFS Z a b实例存在时,这个DdT Z a b实例才有效,从而让编译器能够安全地解析bot和top的类型。

内容的提问来源于stack exchange,提问作者Daniel Miedema

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 21:27:25