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

时间:2019-05-02 15:01:14

标签: scala lambda

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

 Seq(1,2,3).toSet.map(_ + 1)

但是这样做:

 val foo = Seq(1,2,3).toSet
 foo.map(_ + 1)

还有:(3)

  Seq(1,2,3).toSet[Int].map(_ + 1)

或者这个:

  Seq(1,2,3).toList.map(_ + 1)

toSet的特殊之处在于,它使第一种情况下的类型变得宽松,而第二种情况下的类型却没有?

1 个答案:

答案 0 :(得分:3)

有根据的猜测:

def toSet[B :> A]: Set[B]

vs

def toList: List[A]

由于某种原因toSet是参数化的-如果将toSetmap拆分为两个语句,则在第一种情况下,编译器将不得不假设某些内容并将该类型分配给{{ 1}},然后在val中使用猜为B的{​​{1}}。

但是对于A,它猜测应该将其映射到map中……到底是什么?只有知道Seq(1,2,3).toSet.map的类型,您才能猜测B >: Int的类型。

长话短说,_ * 2似乎是个问题,因为如果这样做的话:

_

有效。

我只能猜测是事与愿违的[B :> A]协变的尝试。