0

我有一个包含抽象数据类型作为参数的函数。为了让我能够等同于我使用的这种抽象数据类型:

myfunction:: Eq x=> [x]->[x]->[x]

所以它接受两个 x 列表,并输出一个 [x] 列表

但是,当我从另一个函数调用它时:

anotherfunction::[x] -> [x] -> [x]
anotherfunction a b = myfunction a b

它说

在表达式 myfunction ab 中没有使用 myfunction 产生 (Eq x) 的实例

但是,如果我从控制台调用 myfunction ,则使用两个参数可以正常工作。

我该如何解决这个问题?

4

2 回答 2

10

Eq在类型中使用anotherfunction

anotherfunction::Eq x => [x] -> [x] -> [x]
anotherfunction a b = myfunction a b

myfunction仅适用于类中的Eq类型。但是您当前对anotherfunction声明的定义它可以与任何类型一起使用。如果您使用不在类中anotherfunction的类型进行调用,这将导致问题- 它无法调用.Eqmyfunction

于 2012-09-08T12:33:55.010 回答
2

myfunction:: Eq x=> [x]->[x]->[x]

这里 x 必须有一个 Eq 类的实例声明。

anotherfunction::[x] -> [x] -> [x]
anotherfunction a b = myfunction a b

这里myfunction假定类型 ofabto 属于Eq类,但类型 ofanotherfunction没有这样的约束。

正确的方法是也指定这个约束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实例 forInt已经定义,因此您不会收到任何错误。因此,如果您将多态类型分配x给任何特定类型,那么您只需要确保它具有受约束类的实例。

于 2012-09-08T13:01:20.577 回答