为什么Function2没有andThen方法?

时间:2014-02-10 14:40:28

标签: scala function-composition

为什么{1}仅存在于Scala中的单个参数函数?

以下代码有效:

andThen

但为什么多参数函数没有val double = (x: Int) => x * 2 val timesFour = double andThen double 方法?

andThen

添加此方法肯定是微不足道的。有没有理由从标准库中省略它?

4 个答案:

答案 0 :(得分:4)

我无法说明为什么Function2不提供andThen,但Scalaz为各种arities的函数定义了Functor个实例map等效于andThen,意思是你可以写

val multiplyAndDouble = multiply map double

答案 1 :(得分:1)

这里有一个类似的问题: Scala API 2.10.*: Function2.andThen what happened to?,但也没有答案。在我看来这是可能的。以下是Scala 2.11.1的工作示例:

object TestFunction2 {

  def main(args: Array[String]): Unit = {
    val double = (x: Int) => x * 2
    val timesFour = double andThen double
    println(timesFour(2)) // prints 8

    val multiply = (x: Int, y: Int) => x * y
    val multiplyAndDouble = multiply andThen double
    println(multiplyAndDouble(1, 3)) // prints 6
  }

  implicit def toFunc2(function2: Function2[Int, Int, Int]): Func2[Int, Int, Int] = {
    new Func2[Int, Int, Int] {
      def apply(v1: Int, v2: Int): Int = function2(v1, v2)
    }
  }
}

trait Func2[-T1, -T2, +R] extends Function2[T1, T2, R] {
  def andThen[A](g: R => A): (T1, T2) => A = { (x, y) => g(apply(x, y)) }
}

答案 2 :(得分:0)

我刚刚发现可以轻松解决以下问题:

val multiplyAndDouble = multiply.tupled andThen double
val res = multiplyAndDouble(1, 3) // res = 6

答案 3 :(得分:0)

写theons答案的另一种方法是使用:

val multiplyAndDouble = double compose multiply.tupled
val result = multiplyAndDouble(2, 6) // res 24