我有一个包含抽象数据类型作为参数的函数。为了让我能够将我使用的抽象数据类型等同于:
myfunction:: Eq x=> [x]->[x]->[x]
因此它包含两个x列表,并输出[x]
列表然而,当我从另一个函数调用它时:
anotherfunction::[x] -> [x] -> [x]
anotherfunction a b = myfunction a b
它说
使用myfunction时没有(Eq x)的实例 表达myfunction a b
但是,如果我从控制台调用myfunction,使用这两个参数就可以了。
我该如何解决这个问题?
答案 0 :(得分:10)
在Eq
。
anotherfunction
anotherfunction::Eq x => [x] -> [x] -> [x]
anotherfunction a b = myfunction a b
myfunction
仅适用于Eq
类中的类型。但是您目前对anotherfunction
的定义声称它可以适用于任何类型。如果您使用anotherfunction
类中不的类型调用Eq
,则会导致问题 - 它将无法调用myfunction
。< / p>
答案 1 :(得分:2)
myfunction:: Eq x=> [x]->[x]->[x]
这里x必须有一个Eq类的实例声明。
anotherfunction::[x] -> [x] -> [x]
anotherfunction a b = myfunction a b
此处myfunction
假定a
和b
的类型属于Eq
类,但anotherfunction
的类型不构成此类约束。
正确的方法是在anotherfunction
中指定此约束。
anotherfunction:: Eq x => [x] -> [x] -> [x]
anotherfunction a b = myfunction a b
如果您有任何疑惑,最简单的方法是不向anotherfunction
提供任何类型
并在ghci中加载该文件,并查看为anotherfunction
推断的类型。
> :t anotherfunction
anotherfunction :: Eq x => [x] -> [x] -> [x]
ghc将推断出最通用的类型,因此如果您希望类型更具体,那么最好为x提供显式类型。喜欢
anotherfunction :: [Int] -> [Int] -> [Int]
此Eq
Int
实例已定义,因此您不会收到任何错误。因此,如果将多态类型x
分配给任何特定类型,则只需确保它具有受约束类的实例。