參數解組
假設您有一個配對清單
val xs: List[(Int, Int)]
而且您想要將 xs
對應到 Int
清單,以便每個數字配對對應到它們的總和。以前,執行此操作的最佳方式是使用樣式比對分解
xs map {
case (x, y) => x + y
}
雖然正確,但這也不方便且令人困惑,因為 case
表示樣式比對可能會失敗。作為更簡短且更明確的替代方案,Scala 3 現在允許
xs.map {
(x, y) => x + y
}
或等效地
xs.map(_ + _)
和
def combine(i: Int, j: Int) = i + j
xs.map(combine)
通常,如果這是預期的類型,則具有 n > 1
參數的函數值會包裝在 ((T_1, ..., T_n)) => U
形式的函數類型中。元組參數會分解,其元素會直接傳遞到基礎函數。
更具體地說,適應會套用於不匹配的形式參數清單。特別是,適應並非函數類型之間的轉換。這就是為什麼不接受以下內容的原因
val combiner: (Int, Int) => Int = _ + _
xs.map(combiner) // Type Mismatch
函數值必須明確元組化,而不是取消參數元組化
xs.map(combiner.tupled)
儘管強烈不建議,但為了產生相同的效應,使用者程式碼中可以提供隱式轉換
import scala.language.implicitConversions
transparent inline given `fallback untupling`: Conversion[(Int, Int) => Int, ((Int, Int)) => Int] = _.tupled
xs.map(combiner)
在套用轉換之前會嘗試參數解組,因此範圍內的轉換無法破壞解組。
參考
如需更多資訊,請參閱
在本文中