链式索引Scala编译器错误的解决方法?

时间:2016-04-27 15:48:29

标签: scala scala-breeze nd4j

ND4S和Breeze中的链式索引会产生Scala编译器错误:

var m = Nd4j.create(2, 3)
var a = m(0, ->)
var b = a(0)
var c = m(0, ->)(0)

前两个工作,但第三个工作:

  

方法适用的参数不足:(隐式ev:org.nd4s.NDArrayEvidence [org.nd4j.linalg.api.ndarray.INDArray,B],隐式ev2:scala.reflect.Manifest [B])org.nd4j .linalg.api.ndarray.INDArray类RichINDArray。

我尝试使用(0, 0)代替(0),因为它仍然是2d,但这并不重要。额外括号的许多变化。

Scala解析器是否认为它是ND4S中的其他构造或错误?是否有一些解决方法可以使链接工作?

编辑:

在微风下:

var m = DenseMatrix.zeros[Int](5,5)
var a = m(0, ::)
var b = a(0)
var c = m(0, ::)(0)

a和b工作但c产生此编译器错误:

  

类型不匹配; found:需要Int(0):breeze.linalg.support.CanSlice2 [breeze.linalg.DenseMatrix [Int],Int,collection.immutable。::。type,?]

也许这是解析为curried函数调用,或者宏以一种在这里不起作用的方式扩展。虽然我猜一个人永远不需要链式索引,因为m(0, 0)在上面工作并且任何索引都可以折叠,对于在这些情况下欺骗S​​cala的一般情况是否有一些解决方案?

此外,链接适用于多维数组:

var n = Array.ofDim[Double](2, 3)
var x = n(0)(0)

1 个答案:

答案 0 :(得分:3)

方法m(0, ->)m(0, ::)都采用第二个隐式参数列表。因此,链接调用被Scala解释为试图显式提供此隐式参数列表。这就是为什么它报告参数编号不匹配和参数类型不匹配的原因。

尝试使用(m(0, ->))(0)m(0, ->).apply(0)(或Breeze模拟)。这会强制Scala隐式提供隐式参数列表,然后您的第二个调用将成为正常的函数调用。