Scala:如何设计高阶函数?

时间:2019-03-06 15:14:22

标签: scala currying

我想在scala中设计一个高级函数,看起来像是在流动:

  

def处理(数据:Seq [Double],costFun:**):Double

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

  

def costGauss(数据:Seq [Double],scalaShift:布尔值):Double

     

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

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

1 个答案:

答案 0 :(得分:3)

您似乎只需要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))

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

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

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