5

在 Scala 中调用带有类型参数的方法时,我经常尝试安排代码,以便类型推断器可以自行查找类型参数,而无需我填写它们。在某些情况下,它会失败,我必须手动提供它们。

大多数时候,这不是问题,但是对于具有多个类型参数的方法(例如,大多数需要隐式参数的方法CanBuildFrom),我想知道是否有一种方法可以通过只给它一个所需的类型来帮助类型推断器参数,并要求它尝试猜测其他参数。它看起来像在内部,无论如何它必须做这样的事情,因为它有时会产生形式为“预期类型A[B, ?]但得到A[C, D]”的错误消息,这意味着在 的两个类型参数中A,它可以找到第一个B但有没有关于第二个的信息。

用例: Tomasz 的问题,其中代码:

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,并要求它自己找出Aand That?本质上,类似的东西,

List("abc", "def") map firstAndLast[CC = String]

或者

List("abc", "def") map firstAndLast[String, <guess>, <guess>]

我知道这些行不起作用;我正在寻找一种解决方法(或寻找已经讨论过的未来语言功能的指针,这可能会导致这种情况)。

4

1 回答 1

1

不,你不能。有类型 lambda s 和type它本身可以用于类型(如在类和特征中),但不能用于类型参数。例如:

// Declaring a type alias
type StringMap[Elem] = Map[String, Elem]

// Calling an `def f[M[_]]` but passing a `Map`
f[({type l[A]=Map[String,A]})#l]

// note that f could also be called like this:
f[StringMap]
于 2012-05-28T16:19:50.710 回答