推断lambda的参数类型(再次!)

Dim*_*ima 11 lambda scala

我想知道为什么这不起作用(缺少参数类型)?

 Seq(1,2,3).toSet.map(_ + 1)
Run Code Online (Sandbox Code Playgroud)

但是这样做:

 val foo = Seq(1,2,3).toSet
 foo.map(_ + 1)
Run Code Online (Sandbox Code Playgroud)

以及:(3)

  Seq(1,2,3).toSet[Int].map(_ + 1)
Run Code Online (Sandbox Code Playgroud)

或这个:

  Seq(1,2,3).toList.map(_ + 1)
Run Code Online (Sandbox Code Playgroud)

toSet在第一种情况下使它失去类型,在第二种情况下却没有使它松散的类型有什么特殊之处?

Mat*_*zok 4

有根据的猜测:

def toSet[B :> A]: Set[B]
Run Code Online (Sandbox Code Playgroud)

def toList: List[A]
Run Code Online (Sandbox Code Playgroud)

由于某种原因toSet是参数化的 - 如果您将toSetmap分成两个语句,那么在第一种情况下,编译器将必须假设某些内容并将该类型分配给val,然后使用B猜测为Ain map

但它猜测应该映射到Seq(1,2,3).toSet.map一些东西......到底是什么?仅当您知道 的类型时,B >: Int您才能猜测 的类型。_ * 2_

长话短说,这[B :> A]似乎是问题所在,因为如果我们这样做:

implicit class AsSetOps[F, A](val fa: scala.collection.SeqLike[A, F]) {
  def asSet: Set[A] = fa.toSet[A]
}
Seq(1,2,3).asSet.map(_ * 2)
Run Code Online (Sandbox Code Playgroud)

有用。

我只能猜测这是一些试图做出toSet协变的尝试,结果适得其反。