2011-05-12 50 views
2

我只是将我的一些代码更新到2.9.0,并且遇到了问题。我有一个特性,我称之为“NonStrictIterable”(本质上,一切都应该尽可能的懒惰 - 除非有人真正要求元素,否则NonStrictIterable本身之外的任何代码都不应该运行)。如何在Scala 2.9.0中重写Iterable.flatMap?

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

我得到编译器错误“错误或无法访问的类型”。

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

回答

8

您需要升级到2.9最终。这是以前的RC中的一个错误,它已被修复。

+0

哦,亲爱的!今天我在Eclipse中使用了2.9.0.RC3,而在sbt中使用了2.9.0.final。很混乱。谢谢您的帮助。 – 2011-05-12 23:53:52

1

适合我。我怀疑你实际上是从RC3编译scala-library.jar。

~/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 
+0

哎呀,谢谢!转移到2.9.0.final(我认为我已经完成了...)解决了这个问题。 – 2011-05-12 23:54:33