部分应用函数的 Scala 组合

问题描述 投票:0回答:1

我希望能够从部分应用的函数组成函数。 IE。像这样的:

def average(data: Seq[Option[Double]]): Option[Double] = {
  val numbers = data.flatten
  numbers match {
    case ns if ns.length == 0 => None
    case ns => Some(ns.sum / ns.length)
  }
}

def roundHalfUp(d: Double, rounding: Int): Double = {
  BigDecimal.apply(d).setScale(rounding, BigDecimal.RoundingMode.HALF_UP).doubleValue
}

def round(rounding: Int, number: Option[Double]): Option[Double] = {
  number match {
    case None => None
    case Some(n) => Some(roundHalfUp(n, rounding))
  }
}


val f = average andThen round(2)

f(List(1.23, 2.242, 3.345))

但是我无法让组合函数的分配起作用。我很高兴强制执行我需要参数占位符的函数,即

val f = average(_) andThen round(2,_)
但无论我尝试什么语法都不起作用。

任何人都可以建议正确的语法或替代方法。这应该是简单设计特定语言的功能,所以越简单越好。

scala function composition
1个回答
0
投票

我成功了!我需要将方法提升为函数(使用参数 _):

val r = round(2) _
val a = average _

val f = a andThen r

f(List(1.23, 2.242, 3.345))

或者,没有中间变量,

val f = (average _) andThen (round(2) _)
© www.soinside.com 2019 - 2024. All rights reserved.