Scala 类型参数括号

标签 scala

我知道 trait Foo[T]意味着 T是参数化类型。
但有时我可以看到trait Foo[T1,T2] , 或 trait Foo[T1,T2,R] ,我找不到任何地方描述类型括号内多种类型的含义,你能指出我在这种情况下的用法吗?据我推测, Foo[T1,T2] 只是意味着,它定义了两个类型参数,不一定非要取 T1并返回 T2 .

当我阅读 playframework今天的文档,我再次发现自己对这个问题感到困惑。在文档中,它说:

A BodyParser[A] is basically an Iteratee[Array[Byte],A], meaning that it receives chunks of bytes (as long as the web browser uploads some data) and computes a value of type A as result.



这个解释听起来像,类型括号内的第二个类型参数是返回类型。

我还记得trait Function2 [-T1, -T2, +R] extends AnyRef表示采用 T1 的函数和 T2 , 返回 R .

为什么他们将返回类型放在括号中?这是否意味着括号中的所有最后一个参数都是返回类型?或者他们只是碰巧为返回类型定义了一个新类型 R?

最佳答案

From what I speculate, Foo[T1,T2] just means, it defined two type parameters, it doesn't have to be take a T1 and return a T2.


类型参数的意思无非是“我需要任何类型,但我不想知 Prop 体类型是什么”,其中“我”是编写代码的程序员。类型参数可以像任何其他类型(例如 Int、String 或 Complex)一样使用 - 唯一的区别是在使用它们之前它们是未知的。
见类型 Map[A, +B] .当您第一次阅读本文时,您无法知道 A 和 B 的用途,因此您必须阅读文档:

A map from keys of type A to values of type B.


它解释了类型及其含义。没有什么需要知道或理解的了。它们只是两种类型。可以像 Map[Key, Value] 一样调用 Map但是在源代码中,类型参数最好只有一两个字母。这使得更容易区分类型参数和具体类型。
它是指定类型参数含义的文档。如果没有文档,您必须查看来源并自己找到它们的含义。例如,您必须使用 Function2 [-T1, -T2, +R] 执行此操作.文档只告诉我们这一点:

A function of 2 parameters.


好的,我们知道三个类型参数中的两个是函数期望的参数,但是第三个是什么?我们来看看来源:

def apply(v1: T1, v2: T2): R


啊,现在我们知道T1T2是参数,R 是返回类型。
类型参数也可以在 map 等方法签名中找到:
class List[+A] {
  ..
  def map[B](f: (A) ⇒ B): List[B]
}
这就是将 map 与列表一起使用时的样子。 A可以是任何类型 - 它是列表包含的元素的类型。 B是另一种任意类型。当您知道 map 的作用时,您就会知道 B做。否则你必须先了解 map 。 map 需要一个可以将 List 的每个元素转换为另一个元素的函数。因为你知道A代表列表的元素,你可以从自己那里得到B必须是类型 A转化为。
回答您的所有其他问题:这不应在一个答案中完成。 StackOverflow 上还有很多其他问题和答案,它们也可以回答您的问题。
概括
例如,当您在 Foo[T1, T2] 中看到某些类型参数时你不应该开始哭泣。想一想:“好吧,我有一个 Foo,它需要一个 T1 和一个 T2,如果我想知道他们做什么,我必须阅读文档或来源。”

关于Scala 类型参数括号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5354803/

相关文章:

linux - 在远程服务器上安装 spark 的情况下在 eclipse 上本地运行 spark 代码

scala - Scala 中的列表 - 加冒号与双冒号(+: vs::)

scala - 如何从 Map[String, String] 实例化案例类

Json-circe 无法为密封特性的子类型派生编码器

scala - IntelliJ 上的 SBT 需要很长时间才能刷新

Scala Spark 过滤掉重复出现的零值

scala - 为什么从 SBT 导入 Intellij 项目失败

Scala - 元组上的 Future.sequence

scala - Play Swagger UI url 别名

Scala和Spark UDF功能