2017-05-01 173 views
0

我想將現有函數分配給變量。據this網站,它是一樣簡單:將現有函數分配給變量

val p = scala.math.pow(_, _) 
pow: (Double, Double) => Double = <function2> 

但是當我嘗試做同樣的事情在我的代碼,這是行不通的。

def main(args: Array[String]) = { 
    val p = scala.math.min(_, _) 
    val func = if (args(0).equalsIgnoreCase("min")) math.min(_,_) else math.max(_,_) 
} 

我認爲這可能是由於使用的if並在同一行else條件,但價值分配變量p時以及我得到的錯誤。

錯誤我得到:

缺少的參數類型爲擴展功能((X $ 1,X $ 2)=> scala.math.min(X $ 1,X $ 2))

爲什麼它不適合我,我該如何解決它?

+1

'val p = scala.math.min _' – dmitry

+0

@dmitry爲什麼pow需要2個下劃線,min和max只能用1來完成?即如何知道1個下劃線是否足夠? –

+0

我建議在這裏閱讀最高票數的答案,特別是結尾部分。另外scala.math.pow _單下劃線也可以。知道什麼是足夠的簡短答案是看看它是否成功編譯:) http://stackoverflow.com/questions/8000903/what-are-all-the-uses-of-an-underscore-in-scala – Tanjin

回答

2

類型參數必須爲func定義:

val func: (Int, Int) => Int = if (args.head.equalsIgnoreCase("min")) math.min(_,_) else math.max(_,_) 

或者作爲用戶梅德指出,使用單一的下劃線:

val func = if (args.head.equalsIgnoreCase("min")) math.min _ else math.max _ 

但是好像你是一個初學者到語言 - 我個人會像第一個例子那樣明確地說明感興趣的類型,直到你對事物有更好的處理。

+0

是,今天開始學習! –

1

只是有一個scala.math.pow方法,但也有minmax多個重載:def min(x: Double, y: Double): Doubledef min(x: Int, y: Int): Int等沒有提供預期的參數類型,斯卡拉無法知道你的意思是哪一個。我會寫例如val p = scala.math.min(_: Int, _: Int)val p = scala.math.min(_: Double, _: Double)(或者您可以直接指定p的類型,如Tanjin的答案)。

val p = min _恰好工作,因爲min(x: Int, y: Int)過載是最具體的過載,但我認爲在啓動時依賴它是一個壞主意。