链式索引 Scala 编译器错误的解决方法?
Workaround for chained indexing Scala compiler error?
ND4S 和 Breeze 中的链接索引产生 Scala 编译器错误:
var m = Nd4j.create(2, 3)
var a = m(0, ->)
var b = a(0)
var c = m(0, ->)(0)
前两个有效,但第三个产生:
not enough arguments for method apply: (implicit ev: org.nd4s.NDArrayEvidence[org.nd4j.linalg.api.ndarray.INDArray,B], implicit ev2: scala.reflect.Manifest[B])org.nd4j.linalg.api.ndarray.INDArray in class RichINDArray.
我尝试使用 (0, 0)
而不是 (0)
,因为它仍然是 2d,但这并不重要。以及额外括号的许多变体。
这是 Scala 解析器认为它是其他构造还是 ND4S 中的错误?是否有一些变通语法可以使链接工作?
编辑:
在Breeze之下:
var m = DenseMatrix.zeros[Int](5,5)
var a = m(0, ::)
var b = a(0)
var c = m(0, ::)(0)
a 和 b 可以工作,但 c 会产生此编译器错误:
type mismatch; found : Int(0) required: breeze.linalg.support.CanSlice2[breeze.linalg.DenseMatrix[Int],Int,collection.immutable.::.type,?]
可能这被解析为柯里化函数调用,或者宏以此处不起作用的方式展开。虽然我猜一个人永远不需要链接索引,因为 m(0, 0)
在上面工作并且任何索引都可以折叠,但是在这些情况下是否有一些解决方案来欺骗 Scala?
此外,链接适用于多维数组:
var n = Array.ofDim[Double](2, 3)
var x = n(0)(0)
m(0, ->)
和 m(0, ::)
两种方法都采用第二个隐式参数列表。因此,链接调用被 Scala 解释为试图显式提供这个隐式参数列表。这就是它报告参数编号不匹配和参数类型不匹配的原因。
尝试使用 (m(0, ->))(0)
或 m(0, ->).apply(0)
(或 Breeze 类似物)。这会强制 Scala 隐式提供隐式参数列表,然后您的第二次调用将成为您预期的普通函数调用。
ND4S 和 Breeze 中的链接索引产生 Scala 编译器错误:
var m = Nd4j.create(2, 3)
var a = m(0, ->)
var b = a(0)
var c = m(0, ->)(0)
前两个有效,但第三个产生:
not enough arguments for method apply: (implicit ev: org.nd4s.NDArrayEvidence[org.nd4j.linalg.api.ndarray.INDArray,B], implicit ev2: scala.reflect.Manifest[B])org.nd4j.linalg.api.ndarray.INDArray in class RichINDArray.
我尝试使用 (0, 0)
而不是 (0)
,因为它仍然是 2d,但这并不重要。以及额外括号的许多变体。
这是 Scala 解析器认为它是其他构造还是 ND4S 中的错误?是否有一些变通语法可以使链接工作?
编辑:
在Breeze之下:
var m = DenseMatrix.zeros[Int](5,5)
var a = m(0, ::)
var b = a(0)
var c = m(0, ::)(0)
a 和 b 可以工作,但 c 会产生此编译器错误:
type mismatch; found : Int(0) required: breeze.linalg.support.CanSlice2[breeze.linalg.DenseMatrix[Int],Int,collection.immutable.::.type,?]
可能这被解析为柯里化函数调用,或者宏以此处不起作用的方式展开。虽然我猜一个人永远不需要链接索引,因为 m(0, 0)
在上面工作并且任何索引都可以折叠,但是在这些情况下是否有一些解决方案来欺骗 Scala?
此外,链接适用于多维数组:
var n = Array.ofDim[Double](2, 3)
var x = n(0)(0)
m(0, ->)
和 m(0, ::)
两种方法都采用第二个隐式参数列表。因此,链接调用被 Scala 解释为试图显式提供这个隐式参数列表。这就是它报告参数编号不匹配和参数类型不匹配的原因。
尝试使用 (m(0, ->))(0)
或 m(0, ->).apply(0)
(或 Breeze 类似物)。这会强制 Scala 隐式提供隐式参数列表,然后您的第二次调用将成为您预期的普通函数调用。