比较Haskell中的不同类型

时间:2014-11-27 21:31:10

标签: 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)
                         ....

然而,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

我是新手,我不确定如何投这个 - 有人能帮我借这个吗?

1 个答案:

答案 0 :(得分:7)

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

myCompare :: Eq a => Int -> Int -> [a] -> Int

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

比较特定类型的两个值是不是给定的;它是由Eq类型类提供的。虽然大多数ADT可以简单地派生Eq来获取该实例,但您仍需要确保您要比较的类型,实际具有该实例,以及这正是约束所做的事情。