在 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

更多详细信息