2016-05-11 4 views
0

私は入力パラメータのデータ型を明示的に定義するのではなく、classTagを使う関数を持っています。例えばclassTag scala using map

、機能を実行する際に

def getColMult[T: ClassTag](A: Array[T], cols: Array[Int]): Array[Array[Double]] = { 
    if (cols.size == 1) { 
     var C = Array.apply(A.map{_(cols(0))}) 
     C.transpose 
     } 
    else { 
     var C = Array.apply(A.map{_(cols(0))},A.map{_(cols(1))}) 
     for (i <- (2 to cols.size - 1)) { 
      C = C++ Array(A.map{_(cols(i))}) 
     } 
     C.transpose 
    } 
} 

、これはこのエラーを得るでしょう:

名::35::エラー:エラー メッセージをコンパイルTは=パラメータに のvar Cを取ることはありません。 Array.apply(A.map(_(COLS(0))})

コンソール:39:エラー:Tは、パラメータを取らない するvar C = Array.apply(A.map {(COLS(0。 ))}}、A.map {(COLS(1))})

+0

あなたはその行で何をしようとしていますか? –

+0

特定の列をArray [Array [Double]]から取得しようとしています.1つの列しか取得しなければならない場合は、この行A.map {_(cols(0))}を使用してdoubleその列に対応する。配列の配列として作るために、私はscalaでapply関数を使わなければなりません。取得する列が複数ある場合は、ループを使用する必要があります。 –

+0

しかし、 'T'は必ずしも' Array'とは限りません。コンパイラが知っていることは、 'A.map(...) 'の中の' _'は何でもよいということです。 –

答えて

1

あなたは_.apply()_()を交換した場合、エラーがより明確になります:

import scala.reflect.ClassTag 

object Foo { 
    def getColMult[T: ClassTag](a: Array[T], cols: Array[Int]): Array[Array[Double]] = { 
    if (cols.size == 1) { 
     val c = Array(a.map({_.apply(cols(0))})) 
     c.transpose 
    } else { 
     val c = Array(a.map({_.apply(cols(0))}), a.map({_.apply(cols(1))})) ++ 
     (2 to cols.size - 1).flatMap({ i => 
      Array(a.map({_.apply(cols(i))})) 
     }) 
     c.transpose 
    } 
    } 
} 

はところで、そのコードが

と機能的に同等に見えるあなたに

test.scala:6: error: value apply is not a member of type parameter T 
     val c = Array(a.map({_.apply(cols(0))})) 
          ^
test.scala:9: error: value apply is not a member of type parameter T 
     val c = Array(a.map({_.apply(cols(0))}), a.map({_.apply(cols(1))})) ++ 
          ^
test.scala:9: error: value apply is not a member of type parameter T 
     val c = Array(a.map({_.apply(cols(0))}), a.map({_.apply(cols(1))})) ++ 
                 ^
test.scala:11: error: value apply is not a member of type parameter T 
      Array(a.map({_.apply(cols(i))})) 

を与えます

def getColMult2[T: ClassTag](a: Array[T], cols: Array[Int]): Array[Array[Double]] = { 
    val c = cols.map({col => a.map({_.apply(col)})}) 
    c.transpose 
} 
関連する問題