2017-08-16 103 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