带有参数的方法的 Scala Typeclass
Scala Typeclass for methods with parameters
我试图通过类型类将 "multiply by a scalar" 之类的方法添加到 Array[T]
中,以模仿 numpy 的功能。我查看了 an example,它有效并向 Array[T]
添加了一个没有参数的 "show" 方法。但是,就我而言,我发现我无法添加带有参数的方法,例如array.*(2.0)
.
使用 Scala 2.12.6.
我怎样才能让这段代码起作用?
package numpy
trait BehaveLikeNumpy[T] {
def *(a: Array[T], x: T): Array[T]
}
object BehaveLikeNumpyInstances {
def apply[T](implicit bln: BehaveLikeNumpy[T]): BehaveLikeNumpy[T] = bln
object ops {
def *[T: BehaveLikeNumpy](a: Array[T], x: T): Array[T] = BehaveLikeNumpyInstances[T].*(a, x)
implicit class BehaveLikeNumpyOps[T: BehaveLikeNumpy](a: Array[T]) {
def *(x: T) = BehaveLikeNumpyInstances[T].*(a, x)
}
}
implicit val arrayTimes_Double = (a: Array[Double], x: Double) => a.map(y => y * x)
}
package some.pkg
import numpy.BehaveLikeNumpyInstances
import numpy.BehaveLikeNumpyInstances.ops._
val aaa: Array[Double] = (0 until 5).toArray.map(_.toDouble)
aaa.show // Works. See https://blog.scalac.io/2017/04/19/typeclasses-in-scala.html
val s1 = aaa.*(2.0)// Error: value * is not a member of Array[Double]
val s2 = aaa * 2.0 // Error: value * is not a member of Array[Double]
首先你丢失了类型(用于将 lambda 转换为 SAM 特征)
implicit val arrayTimes_Double: BehaveLikeNumpy[Double] =
(a: Array[Double], x: Double) => a.map(y => y * x)
其次你丢了下划线
import numpy.BehaveLikeNumpyInstances._
我试图通过类型类将 "multiply by a scalar" 之类的方法添加到 Array[T]
中,以模仿 numpy 的功能。我查看了 an example,它有效并向 Array[T]
添加了一个没有参数的 "show" 方法。但是,就我而言,我发现我无法添加带有参数的方法,例如array.*(2.0)
.
使用 Scala 2.12.6.
我怎样才能让这段代码起作用?
package numpy
trait BehaveLikeNumpy[T] {
def *(a: Array[T], x: T): Array[T]
}
object BehaveLikeNumpyInstances {
def apply[T](implicit bln: BehaveLikeNumpy[T]): BehaveLikeNumpy[T] = bln
object ops {
def *[T: BehaveLikeNumpy](a: Array[T], x: T): Array[T] = BehaveLikeNumpyInstances[T].*(a, x)
implicit class BehaveLikeNumpyOps[T: BehaveLikeNumpy](a: Array[T]) {
def *(x: T) = BehaveLikeNumpyInstances[T].*(a, x)
}
}
implicit val arrayTimes_Double = (a: Array[Double], x: Double) => a.map(y => y * x)
}
package some.pkg
import numpy.BehaveLikeNumpyInstances
import numpy.BehaveLikeNumpyInstances.ops._
val aaa: Array[Double] = (0 until 5).toArray.map(_.toDouble)
aaa.show // Works. See https://blog.scalac.io/2017/04/19/typeclasses-in-scala.html
val s1 = aaa.*(2.0)// Error: value * is not a member of Array[Double]
val s2 = aaa * 2.0 // Error: value * is not a member of Array[Double]
首先你丢失了类型(用于将 lambda 转换为 SAM 特征)
implicit val arrayTimes_Double: BehaveLikeNumpy[Double] =
(a: Array[Double], x: Double) => a.map(y => y * x)
其次你丢了下划线
import numpy.BehaveLikeNumpyInstances._