以下方法調用中的參數「_」是什麼意思?_參數在這種情況下表示什麼?
這是一個接受任何類型參數的通配符嗎?
val integerSorter = msort[Int]((a, b) => a < b) _
的方法msort簽名:
def msort[T](less: (T, T) => Boolean)(xs: List[T]): List[T] = {
以下方法調用中的參數「_」是什麼意思?_參數在這種情況下表示什麼?
這是一個接受任何類型參數的通配符嗎?
val integerSorter = msort[Int]((a, b) => a < b) _
的方法msort簽名:
def msort[T](less: (T, T) => Boolean)(xs: List[T]): List[T] = {
解釋最簡單的方法可能是讓編譯器做大部分的解釋,只是儘量不帶下劃線的第一線:
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 與下劃線那行,你會看到推斷出的類型的integerSorter
是List[Int] => List[Int]
,所以要回答你的第二個問題,沒有,下劃線不允許您提供的參數的任何類型的)
有關詳細信息,請參見第6.7節the language specification的:
表達
e _
是合式如果e
是方法類型的,或者如果e
是 呼叫逐名字pa rameter。如果e
是帶有參數的方法,e _
表示e
由ETA膨脹 轉換爲函數類型(§6.26.5)。
閱讀上ETA膨脹部分也可以是有幫助的。
msort帶有兩個參數,一個返回布爾值的函數和一個要排序的項目列表。函數integerSorter提供第一個參數,而下劃線代表仍然需要指定的列表。查看柯里(http://www.scala-lang.org/old/node/135.html)以獲取更詳細的解釋。
爲什麼要這樣定義它,這不應該是一個明確的電話嗎?因此,將msort函數定義更改爲「def msort [T](less:(T,T)=> Boolean,xs:List [T]):List [T] = {」,然後使用「val integerSorter = msort [ Int()(((a,b)=> a
@ blue-sky:Partial應用程序通常可以成爲構建代碼的非常有用的工具,例如[請參閱我的答案](http://stackoverflow.com/a/10238391/334519)。 –
很乾淨,謝謝! –