Как правило, Force SeqView для Seq, Scala 2.12 - PullRequest
1 голос
/ 05 ноября 2019

Есть ли общий способ заставить SeqView перейти к Seq?

В Scala 2.12 SeqView расширяет Seq, так что вы можете оказаться в лени, когда кто-то захочет получить строгие коллекции.

Я былпытаюсь принудительно заставить SeqViews обращаться к Seqs, но сталкиваюсь с ошибками типов, с которыми я не знаком:

import scala.collection.SeqView
def force(xs: Seq[Int]): Seq[Int] = xs match {
  case view: SeqView[_,_] => view.force
  case other              => other
}

force(List(1, 2, 3))
force(List(1, 2, 3).view)
Cannot construct a collection of type That with elements of type _ based on a collection of type _.

Scastie link: https://scastie.scala -lang.org / ThMW8jixT7Odet17EiDavA

Примечательно, что я могу предоставить параметры типа для соответствия, но, конечно, я получаю предупреждения об удалении типа

import scala.collection.SeqView
def force(xs: Seq[Int]): Seq[Int] = xs match {
  case view: SeqView[Int, Seq[Int]] => view.force
  case other              => other
}

force(List(1, 2, 3))
force(List(1, 2, 3).view)

Предупреждение об удалении типа меня пугает, но, похоже, работает.

Кто-нибудь может пролить свет на это?

1 Ответ

1 голос
/ 05 ноября 2019

Используя Seq[_,_] в сопоставлении паттернов, вы не смогли найти компилятору право на неявное право для класса типа CanBuildFrom.

Обходной путь, который я нашел, чтобы не иметь предупреждения и разрешить компилятору разрешить CanBuildFrom, просто сопоставить с SeqView[_, _], а затем использовать asInstanceOf, чтобы вернуться к исходному типу:

import scala.collection.SeqView

def force[A](xs: Seq[A]): Seq[A] = xs match {
    case view: SeqView[_, _]    => view.asInstanceOf[SeqView[A, Seq[A]]].force
    case other: Seq[A]          => other
}

println(force(List(1, 2, 3)))
println(force(List(1, 2, 3).view))

Я также добавил параметр типа A вместо фиксированного Int.

Другая возможность - просто аннотировать типы с помощью @unchecked:

def force[A](xs: Seq[A]): Seq[A] = xs match {
    case view: SeqView[A@unchecked, Seq[A]@unchecked]   => view.force
    case other: Seq[A]          => other
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...