【问题标题】:In Scala, can I (would some SIP allow me to) specify only certain type parameters of a generic method?在 Scala 中,我可以(某些 SIP 允许我)仅指定泛型方法的某些类型参数吗?
【发布时间】: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,并要求它自己找出AThat 的信息?本质上类似于

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

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

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

【问题讨论】:

标签: scala type-inference type-parameter


【解决方案1】:

不,你不能。 type lambdas 和 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]

【讨论】:

    猜你喜欢
    • 2019-09-24
    • 2010-11-24
    • 2017-06-22
    • 1970-01-01
    • 1970-01-01
    • 2014-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多