【问题标题】:Scala: How to design the high order function?Scala:如何设计高阶函数?
【发布时间】:2019-07-28 07:29:01
【问题描述】:

我想在 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传递给它?

【问题讨论】:

  • 如果每个函数都有不同的签名,你打算如何在你的process函数上调用它们?
  • 看来您不需要高阶函数,而只是在将超参数传递给流程之前部分应用成本函数
  • @ArnonRotem-Gal-Oz 非常感谢,我认为部分应用是我需要的。

标签: scala currying


【解决方案1】:

看来你只需要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 会有些有意义,但反之则不然。

【讨论】:

  • 谢谢^-^。我喜欢curring方法。并且 Float 输入错误,我应该使用 Double 代替。
猜你喜欢
  • 1970-01-01
  • 2021-02-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多