在GitHub上編輯此頁面

相依函數類型

依賴函數類型是一種函數類型,其結果取決於函數的參數。例如

trait Entry { type Key; val key: Key }

def extractKey(e: Entry): e.Key = e.key          // a dependent method

val extractor: (e: Entry) => e.Key = extractKey  // a dependent function value
//             ^^^^^^^^^^^^^^^^^^^
//             a dependent function type

Scala 已有依賴方法,亦即方法的結果類型參照方法的部分參數。方法 extractKey 即為一例。其結果類型 e.Key 參照其參數 e(我們也可以說 e.Key 依賴e)。但到目前為止,還無法將此類方法轉換為函數值,因此無法將它們作為參數傳遞給其他函數,或作為結果傳回。依賴方法無法轉換為函數,僅是因為沒有類型可以描述它們。

在 Scala 3 中,這現在已成為可能。上述 extractor 值的類型為

(e: Entry) => e.Key

此類型描述函數值,這些函數值會採用任何類型為 Entry 的引數 e,並傳回類型為 e.Key 的結果。

回想一下,一般函數類型 A => B 表示為 Function1 特質 的實例(亦即 Function1[A, B]),而具有更多參數的函數類推。依賴函數也表示為這些特質的實例,但它們會獲得額外的精簡。事實上,上述的依賴函數類型僅是下列語法的語法糖

Function1[Entry, Entry#Key]:
  def apply(e: Entry): e.Key

更多詳細資訊