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))
顺便说一下:不要使用 Float
s,尤其是对于占用 O(1) 内存的微小结果。 Seq[Float] => Double
会使 有一定的意义 ,但反之则不然。
我想在 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))
顺便说一下:不要使用 Float
s,尤其是对于占用 O(1) 内存的微小结果。 Seq[Float] => Double
会使 有一定的意义 ,但反之则不然。