比较Haskell中的不同类型

lea*_*ell 2 haskell ghci

我正在尝试检查haskell应用程序中的相等性,它接受类型为[a]的xs,如下所示:

myCompare :: Int -> Int -> [a] -> Int
myCompare pointer x xs = if pointer < length xs
                         then if xs !! pointer == xs !! (pointer+1)
                         ....
Run Code Online (Sandbox Code Playgroud)

但是,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
Run Code Online (Sandbox Code Playgroud)

我不熟悉各种类型,我不确定我怎么能投这个 - 有人能帮我借这个吗?

Bar*_*icz 7

只需执行编译器告诉您的操作:Eq为您的函数添加约束.

myCompare :: Eq a => Int -> Int -> [a] -> Int
Run Code Online (Sandbox Code Playgroud)

在编写时a,告诉编译器该函数可以在任何类型上运行; 换句话说,这意味着你不期望任何类型的东西.

比较特定类型的两个值不是给定的; 它是由Eq类型类提供的.虽然大多数ADT可以简单地派生Eq来获取该实例,但您仍需要确保您要比较的类型值实际上具有该实例,而这正是约束正在执行的操作.