2016-05-11 3 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 не принимает параметры уага C = Array.apply (A.map (_ (COLS (0))})

консоли: 39: ошибка:. Т не принимают параметры вар C = Array.apply (A.map {(смещ_по_столбцам (0))}, A.map { (перевалы (1))})

+0

Что вы пытаетесь сделать с этой линией? –

+0

Я пытаюсь получить конкретный столбец из массива [Array [Double]] A. Если мне нужно получить только один столбец, я использую эту строку A.map {_ (cols (0))}, выводящий массив из двух соответствующий этой колонке. Чтобы сделать его массивом массива, я должен использовать функцию apply в scala. Если у меня есть несколько столбцов для получения, я должен использовать циклы. –

+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))})) 

Btw, что код выглядит функционально эквивалентно

def getColMult2[T: ClassTag](a: Array[T], cols: Array[Int]): Array[Array[Double]] = { 
    val c = cols.map({col => a.map({_.apply(col)})}) 
    c.transpose 
} 
Смежные вопросы