haskell - MultiParamTypeClasses 的歧义问题

标签 haskell

我有一个定义如下的类型类:

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两者都需要 va待解决。自 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/

相关文章:

haskell - 列表理解占用太多内存

haskell - 循环遍历镜头,并使用每个镜头进行 View 和设置

string - 在 String Haskell 中的每个标点符号后插入空格

haskell - GHCi 中 String 和 [Char] 类型值的表示不一致

algorithm - 生成列表所有前缀的最有效的纯函数算法是什么?

haskell - Haskell 中 zipWith fibonacci 的时间复杂度

haskell - Haskell 中的 floor 和 truncate 有区别吗

list - Haskell - 删除大于 n 的元组列表中的元素

haskell - 从任意未知 Nats 中提取值

haskell - 具有递归和列表理解的质数生成器