相依函數類型
依賴函數類型是一種函數類型,其結果取決於函數的參數。例如
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