Как я могу переопределить Iterable.flatMap в Scala 2.9.0? - PullRequest
2 голосов
/ 13 мая 2011

Я просто обновляю часть своего кода до 2.9.0, и я столкнулся с проблемой. У меня есть черта, которую я называю «NonStrictIterable» (по сути, все должно быть как можно более ленивым - ни один код вне самого NonStrictIterable не должен запускаться, пока кто-то фактически не запросит элемент).

Однако в версии 2.9.0 я не могу переопределить flatMap. Вот урезанная версия с ошибкой:

import scala.collection.generic.CanBuildFrom

trait NonStrictIterable[A] extends Iterable[A] { self =>
  def iterator: Iterator[A]

  override def flatMap[B, That](f: A => TraversableOnce[B])(implicit bf: CanBuildFrom[Iterable[A], B, That]): That = {
    new NonStrictIterable[B] {
      def iterator = self.iterator flatMap { a: A => f(a).toIterable.iterator }
    }.asInstanceOf[That]
  }
}

Раньше это работало до 2.9.0, но теперь я получаю "метод flatMap ничего не переопределяет". Просматривая сигнатуру метода для Iterable.flatMap, я вижу, что TraversableOnce в сигнатуре типа изменилось на enTraversableOnce. Внесение соответствующего изменения

import scala.collection.GenTraversableOnce
import scala.collection.generic.CanBuildFrom

trait NonStrictIterable[A] extends Iterable[A] { self =>
  def iterator: Iterator[A]

  override def flatMap[B, That](f: A => GenTraversableOnce[B])(implicit bf: CanBuildFrom[Iterable[A], B, That]): That = {
    new NonStrictIterable[B] {
      def iterator = self.iterator flatMap { a: A => f(a).toIterable.iterator }
    }.asInstanceOf[That]
  }
}

Я получаю ошибку компилятора "ошибочный или недоступный тип".

Что происходит? Может кто-нибудь предложить обходной путь?

Ответы [ 2 ]

8 голосов
/ 13 мая 2011

Вам нужно перейти на финальную версию 2.9.Это была ошибка в предыдущем RC, которая была исправлена.

1 голос
/ 13 мая 2011

У меня работает.Я подозреваю, что вы на самом деле компилируете против scala-library.jar из RC3.

 ~/code/scalaz[scala-2.9.x*]: scala29
Welcome to Scala version 2.9.0.final (Java HotSpot(TM) 64-Bit Server VM, Java 1.6.0_22).
Type in expressions to have them evaluated.
Type :help for more information.

scala> import scala.collection.GenTraversableOnce
import scala.collection.GenTraversableOnce

scala> import scala.collection.generic.CanBuildFrom
import scala.collection.generic.CanBuildFrom

scala> 

scala> trait NonStrictIterable[A] extends Iterable[A] { self =>
     |  def iterator: Iterator[A]
     | 
     |  override def flatMap[B, That](f: A =>
     | GenTraversableOnce[B])(implicit bf: CanBuildFrom[Iterable[A], B,
     | That]): That = {
     |    new NonStrictIterable[B] {
     |      def iterator = self.iterator flatMap { a: A => f(a).toIterable.iterator }
     |    }.asInstanceOf[That]
     |  }
     | }
defined trait NonStrictIterable
...