我是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