无法证明显式类型绑定错误中的约束

时间:2014-12-04 18:56:03

标签: haskell

我使这个功能是Haskell:

countOccurrences :: t -> [t] -> Int
countOccurrences x [] = 0
countOccurrences x (a:b)    |x == a = 1 + (countOccurrences x b)
                            |otherwise = countOccurrences x b

我收到以下错误:

ERROR file:{Hugs}\packages\hugsbase\Hugs.hs:38 - Cannot justify
constraints in explicitly typed binding
*** Expression    : countOccurrences
*** Type          : a -> [a] -> Int
*** Given context : ()
*** Constraints   : Eq a

但是,如果我评论第一行,该功能可以完美地运行:

--countOccurrences :: t -> [t] -> Int
countOccurrences x [] = 0
countOccurrences x (a:b)    |x == a = 1 + (countOccurrences x b)
                            |otherwise = countOccurrences x b

为什么?

1 个答案:

答案 0 :(得分:4)

当您指定t -> [t] -> Int的类型签名时,编译器无法将其与Eq t => t -> [t] -> Int的推断对齐。 Eq t的约束非常重要,因为您在函数定义中使用了x == a。使用==的唯一方法是,您要比较工具Eq的值。通过明确告诉编译器您的类型不一定实现Eq,它无法进行类型检查。

通过删除类型签名,您允许编译器完全自己推断类型。如果您在Hugs或GHCi中加载文件,则可以检查函数的类型,并且您将看到编译器推断出Eq t约束。