Question

I'm just updating some of my code to 2.9.0, and I've run into a problem. I have a trait that I call "NonStrictIterable" (essentially, everything should be as lazy as possible --- no code outside NonStrictIterable itself should run until someone actually asks for an element).

In 2.9.0, I don't seem to be able to override flatMap, however. Here's a cut down version, that exhibits the error:

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]
  }
}

This used to work pre 2.9.0, but now I get "method flatMap overrides nothing". Looking up the method signature for Iterable.flatMap, I see that TraversableOnce in the type signature has changed to enTraversableOnce. Making the corresponding change

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]
  }
}

I get the compiler error "erroneous or inaccessible type".

What's going on? Can someone suggest a workaround?

Was it helpful?

Solution

You need to upgrade to 2.9 final. This was an error in a previous RC which has been fixed.

OTHER TIPS

Works for me. I suspect that you are actually compiling against scala-library.jar from 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
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top