SML-错误:运算符和操作数不一致[重载-实例化错误]



我是SML的新手,我需要帮助解决这个问题,

我想做的是,我有一个int*int的元组列表,输出是一个元组元素相加的列表,如下所示:

[(1,2),(3,4)...] = [3,7,....]

这是我为此做的代码,但我有一个错误,我不知道如何解决

fun sumpares [] = []
| sumpares [(x,y)] = [x+y]
| sumpares ((x,y)::xs) = [x+y]::sumpares(xs)

这就是错误:

stdIn:68.28-68.47 Error: operator and operand do not agree [overload - bad instantiation]
operator domain: 'Z[OL(+,+)] list * 'Z[OL(+,+)] list list
operand:         'Z[OL(+,+)] list * 'Z[OL(+,+)] list
in expression:
(x + y :: nil) :: sumpares xs

我该怎么修?此外,如果你有列表而不是元组,有没有办法做到这一点

考虑您的sumpares函数。如果我们给它一个空列表,它就会返回一个空的列表。这很容易。

在下一种情况下,我们给它一个(int * int) list,作为回报,我们得到一个int list。到目前为止,sumpares的类型是(int * int) list -> int list。但现在考虑下一个案例。

((x,y)::xs)(int * int) list匹配,但则返回:[x+y]::sumpares(xs)。不能使用::int list添加到int list的前面。只有当sumpares(xs)返回一个int list list时,这才会起作用。

有几种方法可以解决这个问题。

首先,第二种情况根本不需要使用单个元组。让我们摆脱它。

fun sumpares [] = []
| sumpares ((x,y)::xs) = [x+y]::sumpares(xs)

这实际上会编译,因为[]int list list,但int list list不是您想要的。为了得到想要的结果。。。

我们可以使用@运算符来连接这两个列表。

fun sumpares [] = []
| sumpares ((x,y)::xs) = [x+y] @ sumpares(xs)

但是,这比通过将x+y附加到递归调用创建的列表的前面来构建列表的效率要低得多。

fun sumpares [] = []
| sumpares ((x,y)::xs) = (x+y) :: sumpares(xs)

意识到你正在做的是重新实现map的一个非常具体的使用,这可能也很有用。

val sumpares = map op+

通过对map的简单实现进行循环,您可以清楚地看到这一点。

fun map _ [] = []
| map f (x::xs) = f x :: map f xs

最新更新