2017-08-16 105 views
0

我下面从coursera课程而这个例子出现在演讲,但是当我尝试运行它,它如下抛出一个错误:了解斯卡拉钻营

在对象的HelloWorld缺少参数列表方法的MapReduce

未应用的方法仅在预期函数类型时才转换为函数。 您可以通过编写mapReduce _mapReduce(_,_,_)(_,_)而不是mapReduce来明确此转换。

变种斗= 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)) 

回答

1

你必须定义一个不喜欢的参数来创建一个curried函数。像这样:

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

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

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

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

或等价地,

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

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

你也可以给编译器的提示进行转换通过显式声明expession的预期类型自动发生:

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

,不使用vars。他们是邪恶的。只是假装,在scala中没有这样的关键字,直到你学习足够的语言才能够识别极其罕见的情况。

+0

谢谢添加下划线的作品:D神奇 – pannu