在scala

时间:2018-02-15 10:31:18

标签: scala currying

我试图在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

中列表中传递的所有数字的结果

感谢。

1 个答案:

答案 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: _*)