2016-08-25 54 views
0

我想將Doubles的流映射到一個方法,該方法需要兩個參數,其中一個參數具有默認值。我想使用默認參數,所以我的方法只有1個參數,我需要通過:在地圖中使用默認參數的方法

def pow(x:Double, exponent:Double=2.0) = { 
    math.pow(x,exponent) 
    } 

我發現了以下工作,但我不明白爲什麼:

val res = (1 to 100).map(_.toDouble).map(pow(_)) 

我特別困惑,因爲以下不工作(編譯錯誤,因爲有缺少類型的信息):

val pow2 = pow(_) 
    val res = pow2(2.0) 
    println(res) // expect 4.0 
+0

編譯器無法清楚地干擾爲pow2提供的類型。如果你說val pow2 = pow(_:Double),那麼這個例子就行得通。 – sascha10000

+0

你用什麼scala版本(我的版本是2.11.8 REPL)?無法重現行爲,'val pow2 = pow(_)'得到編譯錯誤'缺少參數類型'。如果我寫'val pow2:Double => Double = x => pow(x)',那麼一切正常。 – dveim

+0

抱歉,你是對的,它不是運行時錯誤 –

回答

3

的編譯器不能推斷,您將提供給類型。在res映射中,您明確給它一個Doubles的集合,因此pow(_)不會抱怨。但是,在val pow2 = pow(_)的情況下,它抱怨缺少類型參數。更改爲

val pow2 = pow(_: Double) 
val res = pow2(2.0) 
println(res) 

它會工作得很好。 pow(_)將被擴展爲兩個x => pow(x),此時編譯器無法在沒有類型註釋的情況下輸入x

+0

我真的不明白'pow(_)'做了什麼,因爲'pow'有兩個參數。你能評論一下嗎? –

+0

如果明確寫入類型,則'val pow2 = pow(_)'是'val pow2:Double => Double = x => pow(x)'的簡寫。 – dveim

+0

@dveim說什麼。如果沒有類型註釋'pow(_)'你告訴編譯器「這裏是'pow'函數,稍後我會給你一些'_'參數」,但是你不會告訴它它是什麼類型。你可能會給它一個衝突的,比如'String'或者一個正確的'Double'。錯誤是對前一種情況的保護。 – sebszyller