我正在尝试检查haskell应用程序中的相等性,它接受类型为[a]的xs,如下所示:
myCompare :: Int -> Int -> [a] -> Int
myCompare pointer x xs = if pointer < length xs
then if xs !! pointer == xs !! (pointer+1)
....
然而,Haskell遇到了一个问题,它无法对xs数组中的项进行比较,因为它们可能具有不同的类型。
返回的错误是:
No instance for (Eq a) arising from a use of ‘==’
Possible fix:
add (Eq a) to the context of
the type signature for myCompare :: Int -> Int -> [a] -> Int
我是新手,我不确定如何投这个 - 有人能帮我借这个吗?
答案 0 :(得分:7)
只需执行编译器告诉您的操作:向您的函数添加Eq
约束。
myCompare :: Eq a => Int -> Int -> [a] -> Int
当您编写a
时,您告诉编译器该函数可以在任何类型上运行;换句话说,这意味着你不期待任何类型的东西。
比较特定类型的两个值是不是给定的;它是由Eq
类型类提供的。虽然大多数ADT可以简单地派生Eq
来获取该实例,但您仍需要确保您要比较的类型,实际具有该实例,以及这正是约束所做的事情。