我正在讲课程中的课程,但是当我尝试运行它时,它会抛出如下错误:
缺少对象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))
答案 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