1

マニフェストと、Scala が "new Array[Array[T]]" のようなことを実行できるようにするために必要な消去回避手法について少し読みましたが、これには少し困惑しています....

スプレッドシートのような配列で一連の行を集計する方法があります。たとえば、次のような 2D 配列を想像してください。

11,   5,    4
8,    3,    7
2,    1,    4

その配列の列を合計して [21, 9, 15] のような 1D 配列を吐き出すメソッドを書きました

Ints (Doubles や Floats など) だけでなくジェネリック化したいのですが、パラメーターとマニフェストを追加すると、コンパイル エラーが発生します。

これがコードです

def sumGrid[T](grid: Array[Array[T]])(implicit m: ClassManifest[T]): Array[T] = {

  val sum = new Array[T](grid(0).size)

  for(i <- 0 until grid.size) {
    for(j <- 0 until grid(0).size) {
      sum(j) = sum(j) + grid(i)(j)
    }
  }  
  sum
}

コンパイルエラーは次のとおりです。

[ERROR] ...scala/euler/GridOperations.scala:126: error: type mismatch;
[INFO]  found   : T
[INFO]  required: String
[INFO]         sum(j) = sum(j) + grid(i)(j)
[INFO]                                  ^
[ERROR] one error found

何が起きてる?なぜ文字列が「必要」なのですか?

4

2 に答える 2

6

+文字列に対して常に定義されている演算子を使用するためです。任意のタイプを文字列に変換できるため(toString常に定義されます)、したがって、任意のタイプで機能しTます。

Tただし、算術演算に対応するように、にいくつかの制約を追加することができます。たとえば、暗黙的に使用してNumeric、タイプの追加を定義するオブジェクトを取得できTます。

def sumGrid[T](grid: Array[Array[T]])
(implicit m: ClassManifest[T], num: Numeric[T]): Array[T] = {

  val sum = new Array[T](grid(0).size)

  for(i <- 0 until grid.size) {
    for(j <- 0 until grid(0).size) {
      sum(j) = num.plus( sum(j), grid(i)(j) )
    }
  }  
  sum
}
于 2012-06-20T22:18:22.070 に答える
0

Arrayパーツを処理しましたが、メソッドTがあるという制約はありません。+そのため、Scala は文字列を追加していると認識します。String別の に追加すると、任意の型が に自動変換されますString。そのため、 に自動変換さsum(j)れ、現在は別の であるStringと予想され、その時点であきらめて失敗します。grid(i)(j)String

数値であることについてTは、ものと同様の方法で処理できますClassManifest。ここ:

// I'm using the "context bound" notation, to make the declaration shorter and
// more obvious on what I'm saying about T
def sumGrid[T : ClassManifest : Numeric](grid: Array[Array[T]]): Array[T] = {
  // the following line, plus the Numeric bound, makes T usable as a number
  import scala.math.Numeric.Implicits._

  val sum = new Array[T](grid(0).size)

  for(i <- 0 until grid.size) {
    for(j <- 0 until grid(0).size) {
      sum(j) = sum(j) + grid(i)(j)
    }
  }  
  sum
}
于 2012-06-20T23:09:00.277 に答える