【问题标题】:classTag scala using map使用地图的classTag scala
【发布时间】:2016-05-12 18:34:32
【问题描述】:

我有一个函数使用 classTag 而不是显式定义输入参数的数据类型。

例如,

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

console:39: 错误:T 不带参数。 var C = Array.apply(A.map{(cols(0))}, A.map{(cols(1))})

【问题讨论】:

  • 你想用那条线做什么?
  • 我正在尝试从 Array[Array[Double]] A 中获取特定列。如果我只需要获取一列,我使用这一行 A.map{_(cols(0) )} 输出对应于该列的双精度数组。为了使它成为数组的数组,我必须在 scala 中使用 apply 函数。如果我有多个列要获取,我必须使用循环。
  • T 不一定是Array。所以编译器只知道A.map(...) 中的_ 可以是任何东西。
  • 你能把图片换成文字吗?这使得索引更容易。

标签: scala functional-programming


【解决方案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
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-26
    • 1970-01-01
    • 1970-01-01
    • 2014-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多