了解Scala Currying

时间:2017-08-16 16:11:14

标签: scala currying

我正在讲课程中的课程,但是当我尝试运行它时,它会抛出如下错误:

  

缺少对象HelloWorld中方法mapReduce的参数列表

     

当应用函数类型时,未应用的方法仅转换为函数。   您可以通过撰写mapReduce _mapReduce(_,_,_)(_,_)代替mapReduce来明确转换此内容。

     

var doo = mapReduce(x => x,(x,y)=> x * y,0)

以下是我想要执行的代码。

def mapReduce(map: Int => Int, combine: (Int,Int)=>Int,
                zero: Int)(a: Int,b: Int): Int = {
  if (a>b) zero 
  else combine(map(a), mapReduce(map,combine,zero)(a+1,b))
}

var doo = mapReduce(x => x, (x,y)=>x*y, 0)
println(doo(1,4))

2 个答案:

答案 0 :(得分:3)

mapReduce想要两个参数列表,但是你给它一个。 试试这个:

val doo = mapReduce(x => x, (x,y) => x*y, 0) _

或等效,

val doo = mapReduce(identity, _*_, 0) _

最后的_代表第二个参数列表。它告诉编译器您希望将后缀值作为功能值而不是要计算的表达式。

你也可以给编译器一个提示,通过明确声明预期的类型来自动转换:

val doo: (Int, Int) => Int = mapReduce(identity, _*_, 0)

并且不要使用vars。他们是邪恶的。只是假装,scala中没有这样的关键字,直到你学到足够的语言才能识别实际需要的极少数情况。

答案 1 :(得分:1)

您必须定义一个非核心参数才能创建一个curried函数。像这样:

scala> var doo = mapReduce(x => x, (x,y)=>x*y, 0) _
doo: (Int, Int) => Int = <function2>

scala> println(doo(1,4))
0