2014-05-25 20 views
6

以下方法調用中的參數「_」是什麼意思?_參數在這種情況下表示什麼?

這是一個接受任何類型參數的通配符嗎?

val integerSorter = msort[Int]((a, b) => a < b) _ 

的方法msort簽名:

def msort[T](less: (T, T) => Boolean)(xs: List[T]): List[T] = { 

回答

10

解釋最簡單的方法可能是讓編譯器做大部分的解釋,只是儘量不帶下劃線的第一線:

scala> val integerSorter = msort[Int]((a, b) => a < b) 
<console>:11: error: missing arguments for method msort; 
follow this method with `_' if you want to treat it as a partially applied function 
     val integerSorter = msort[Int]((a, b) => a < b) 
            ^

所以你有它,在msort方法有兩個參數列表,但你只傳遞的參數爲先,並尾隨下劃線是Scala提供的語法告訴編譯器,您希望在那種情況下部分應用。

(如果你嘗試在REPL 下劃線那行,你會看到推斷出的類型的integerSorterList[Int] => List[Int],所以要回答你的第二個問題,沒有,下劃線不允許您提供的參數的任何類型的)

有關詳細信息,請參見第6.7節the language specification的:

表達e _是合式如果e是方法類型的,或者如果e是 呼叫逐名字pa rameter。如果e是帶有參數的方法,e _ 表示e由ETA膨脹 轉換爲函數類型(§6.26.5)。

閱讀上ETA膨脹部分也可以是有幫助的。

+0

爲什麼要這樣定義它,這不應該是一個明確的電話嗎?因此,將msort函數定義更改爲「def msort [T](less:(T,T)=> Boolean,xs:List [T]):List [T] = {」,然後使用「val integerSorter = msort [ Int()(((a,b)=> a

+1

@ blue-sky:Partial應用程序通常可以成爲構建代碼的非常有用的工具,例如[請參閱我的答案](http://stackoverflow.com/a/10238391/334519)。 –

+0

很乾淨,謝謝! –

2

msort帶有兩個參數,一個返回布爾值的函數和一個要排序的項目列表。函數integerSorter提供第一個參數,而下劃線代表仍然需要指定的列表。查看柯里(http://www.scala-lang.org/old/node/135.html)以獲取更詳細的解釋。

相關問題