Вывод типа параметра для лямбды (снова!) - PullRequest
11 голосов
/ 02 мая 2019

Мне интересно, почему это не работает (отсутствует тип параметра)?

 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 Ответ

4 голосов
/ 03 мая 2019

Образованное предположение:

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

против

def toList: List[A]

По какой-то причине toSet является параметрическим - если вы разделите toSet и map на два утверждения, тов первом случае компилятор должен будет что-то предположить и присвоить этот тип val, затем использовать B, предположительно равный A в 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)

это работает.

Я могу только догадываться, что это была какая-то попытка сделать toSet ковариант, который дал обратный эффект.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...