Scala:如何设计高阶函数?

Scala: How to design the high order function?

我想在 scala 中设计一个看起来像流动的高阶函数:

def process(data: Seq[Double], costFun: **): Double

costFun 是一个可用于计算方法成本的函数,因为我有多个成本函数,它们可能具有不同的签名,例如:

def costGauss(data: Seq[Double], scalaShift: Boolean): Double

def costKernal(data: Seq[Double], theta: Int): Double

我应该如何设计流程函数,使具有不同签名的成本函数可以作为参数 costFun 传递给它?

看来你只需要 Seq[Double] => Double 那里:

def processData(data: Seq[Double], lossFunc: Seq[Double] => Double): Double = ???

def lossGauss(data: Seq[Double], scalaShift: Boolean): Double = ???
def lossKernel(data: Seq[Double], theta: Int): Double = ???

val data: Seq[Double] = Seq(1.0, 2.0, 3.0)
processData(data, lossGauss(_, true))
processData(data, lossKernel(_, 1234))

更好的是,将多个参数列表与柯里化一起使用:

def processData(data: Seq[Double], lossFunc: Seq[Double] => Double): Double = ???

def lossGauss(scalaShift: Boolean)(data: Seq[Double]): Double = ???
def lossKernel(theta: Int)(data: Seq[Double]): Double = ???

val data: Seq[Double] = Seq(1.0, 2.0, 3.0)
processData(data, lossGauss(true))
processData(data, lossKernel(1234))

顺便说一下:不要使用 Floats,尤其是对于占用 O(1) 内存的微小结果。 Seq[Float] => Double 会使 有一定的意义 ,但反之则不然。