2

以下のトレイトは、@specializedアノテーションなし、またはmapメソッドなしで正常にコンパイルされます。そうしないと、(少なくとも私にとっては)あまり意味のないコンパイル エラーで失敗します。

[error] (compile:compile) scala.tools.nsc.symtab.Types$TypeError: type mismatch;
[error]  found   : U(in method foreach)(in method foreach)
[error]  required: U(in method foreach)(in method foreach)

これは私が話している特性です:

trait Tuple2Traversable[@specialized(Int, Byte) +A, @specialized(Int, Byte) +B] {

  def foreach[T](fn: (A, B) => T)

  def map[T](fn: (A, B) => T): Traversable[T] = new Traversable[T] {
    def foreach[U](f: T => U) {
      def composed(a: A, b: B) = f(fn(a, b))
      Tuple2Traversable.this.foreach(composed)
    }
  }

  def flatMap[T](fn: (A, B) => Traversable[T]): Traversable[T] = new Traversable[T] {
    def foreach[U](f: (T) => U) {
      def composed(a: A, b: B) = fn(a, b).foreach(f)
      Tuple2Traversable.this.foreach(composed)
    }
  }

  def filter(included: (A, B) => Boolean): Tuple2Traversable[A, B] = new Tuple2Traversable[A, B] {
    def foreach[T](fn: (A, B) => T) {
      def composed(a: A, b: B) = if (included(a, b)) fn(a, b)
      Tuple2Traversable.this.foreach(composed)
    }
  }

  def foldLeft[T](z: T)(fn: (T, A, B) => T): T = {
    var current = z
    def op(a: A, b: B) {
      current = fn(current, a, b)
    }
    foreach(op)
    current
  }

  def asTraversable = new Traversable[(A, B)] {
    def foreach[U](f: ((A, B)) => U) {
      def tupled(a: A, b: B) = f((a, b))
      Tuple2Traversable.this.foreach(tupled)
    }
  }

}

私はしばらくこれをじっと見つめてきました。これを解決する方法についての提案は大歓迎です。

おそらく、このクラスの目的は、タプルの作成を強制することなく、タプルの Traversable を持つことであると付け加えておく必要があります。Aは、 のパラメータとしてaTraversable[(A,B)]を受け入れ ます。「トラバーサブル」が関数を受け入れるようにします。(のように。)Tuple2[A,B] => Tforeach(A, B) => Tdef fn(a: Int, b: Int) = a + b

4

1 に答える 1

2

内部コンパイラのバグのようです。scala 2.9.2 でも同じエラーが発生しますが、scala 2.10-RC2 では正常にコンパイルされます。

于 2012-11-22T11:47:54.623 に答える