依赖函数类型
依赖函数类型是一种函数类型,其结果取决于函数的参数。例如
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