我试图在Scala中使用currying获取参数的总和。这是一个非常基本的问题,所以请不要努力。
如果您可以回答这个问题,请另外通知:
object MultiSum extends App {
var res=0
def sum(f:Int=>Int)(x:Int*)={f(x)}
val a=List(1,2,3,4,5,6,7,8,9)
val b=sum(x=>x+x)(a:_*)
}
所以val b
将存储var a
感谢。
答案 0 :(得分:2)
嗯......首先......我认为你应该调用你的函数collect
而不是sum
。现在,让我们帮助您撰写此collect
。
所以...你的collect
函数有两个参数,
1 - collector
功能。
2 - 积累的事情。
所以...你的收藏家功能需要知道两件事......首先是collected
,第二件是下一件要收集的东西......它会产生下一个收集的东西。
这意味着,对于Int
的收集,您的collector
函数将具有签名(Int, Int) => Int
。
因此,您的收集功能应具有以下签名,
def collect(collector: (Int, Int) => Int)(items: Int*): Int = ???
现在......让我们来实现它。
1 - 使用reduce
def collect(collector: (Int, Int) => Int)(items: Int*): Int =
items.reduce(collector)
2 - 使用fold
def collect(collector: (Int, Int) => Int)(items: Int*): Int =
items.fold(0)(collector)
现在,您可以像这样使用它,
val l = List(1,2,3,4,5,6,7,8,9)
val b = collect((i1, i2) => i1 + i2)(l: _*)