我使这个功能是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
为什么?
答案 0 :(得分:4)
当您指定t -> [t] -> Int
的类型签名时,编译器无法将其与Eq t => t -> [t] -> Int
的推断对齐。 Eq t
的约束非常重要,因为您在函数定义中使用了x == a
。使用==
的唯一方法是,您要比较工具Eq
的值。通过明确告诉编译器您的类型不一定实现Eq
,它无法进行类型检查。
通过删除类型签名,您允许编译器完全自己推断类型。如果您在Hugs或GHCi中加载文件,则可以检查函数的类型,并且您将看到编译器推断出Eq t
约束。