【发布时间】:2012-05-29 00:19:50
【问题描述】:
在 Scala 中调用带有类型参数的方法时,我经常尝试安排代码,以便类型推断器可以自行查找类型参数,而无需我填写它们。在某些情况下,它会失败,我必须手动提供它们。
大多数时候,这不是问题,但是对于具有多个类型参数的方法(例如,大多数方法需要隐式 CanBuildFrom),我想知道是否有办法通过提供类型推断器来帮助它只需要一个类型参数,并要求它尝试猜测其他参数。看起来在内部,它无论如何都必须做这样的事情,因为它有时会产生形式为“预期类型A[B, ?] 但得到A[C, D]”的错误消息,这意味着A 的两个类型参数中,它可以找到第一个 B 但没有关于第二个的信息。
用例: Tomasz’s question,其中代码:
def firstAndLast[CC, A, That](seq: CC)(implicit asSeq: CC => Seq[A], cbf: CanBuildFrom[CC, A, That]): That = {
val b = cbf(seq)
b += seq.head
b += seq.last
b.result
}
不能用List("abc", "def") map firstAndLast 调用,但这会起作用:
List("abc", "def") map firstAndLast[String, Char, String]
在这个例子中,我的问题归结为:有没有办法告诉类型推断器CC 参数应该是String,并要求它自己找出A 和That 的信息?本质上类似于
List("abc", "def") map firstAndLast[CC = String]
或
List("abc", "def") map firstAndLast[String, <guess>, <guess>]
我知道这些行不起作用;我正在寻找一种解决方法(或者寻找已经讨论过的未来语言功能的指针,这可能会导致这种情况)。
【问题讨论】:
-
您可以在 Scala 3.0 中执行此操作,有关 Scala 3 的更多信息:groups.google.com/forum/#!topic/scala-language/PV4q6O1qIh8
标签: scala type-inference type-parameter