2

コードの一部を 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]
  }
}

「エラーまたはアクセスできない型」というコンパイラ エラーが発生します。

どうしたの?誰かが回避策を提案できますか?

4

2 に答える 2

8

2.9ファイナルにアップグレードする必要があります。これは、修正された以前のRCのエラーでした。

于 2011-05-12T21:15:02.040 に答える
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
于 2011-05-12T21:15:03.417 に答える