我有一个定义如下的类型类:
class (Eq a, Show a, Typeable a) => Condition v a where
(和一些方法)
我想编写一个函数,它接受两个具有相同“v”的条件。
analyze :: (Condition v a, Condition v b) => a -> b -> Bool
(为简单起见,返回类型为 Bool)
但是当我尝试编译它时,我得到
Could not deduce (Condition v0 b)
arising from the ambiguity check for ‘analyze’
from the context (Condition v a, Condition v b)
所以它清除不是推断我想说的,而是引入了另一个类型变量 v0。
你能解释一下我写的类型签名的公式有什么问题以及如何解决它吗? RankNTypes 能解决这个问题吗?
最佳答案
Condition v a
两者都需要 v
和 a
待解决。自 v
=>
的右手边没有提到在 analyze
,编译器无法选择正确的 v
.它与具有 foo :: Show a => ()
相同或 foo :: Condition a x => x -> Bool
.您如何选择 a
?不知道Condition
的解释是什么是,但也可能是 v
应由 a
确定- 如果是这种情况,那么你可以写
class Condition v a | a -> v
这称为函数依赖。
关于haskell - MultiParamTypeClasses 的歧义问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28887297/