多参数类型类中引用推断类型的问题求助
解决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
相关产品推荐
相关产品推荐

