Подтвердить что ты не робот

Почему функция Function2 не имеет метода andThen?

Почему andThen существует только для функций с одним аргументом в Scala?

Следующий код работает:

val double = (x: Int) => x * 2
val timesFour = double andThen double

Но почему нет метода andThen для функций с несколькими аргументами?

val multiply = (x: Int, y: Int) => x * y
val multiplyAndDouble = multiply andThen double

<console>:10: error: value andThen is not a member of (Int, Int) => Int

Конечно, добавить этот метод тривиально. Есть ли причина, по которой он был исключен из стандартной библиотеки?

4b9b3361

Ответ 1

Я только что заметил, что легко обойти со следующим:

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

Ответ 2

Я не могу сказать, почему Function2 не предоставляет и andThen, но Scalaz определяет экземпляры Functor для функций различных arities, где map эквивалентно andThen, что означает, что вы можете писать

val multiplyAndDouble = multiply map double

Ответ 3

Здесь есть аналогичный вопрос: Scala API 2.10. *: Function2.andThen, что случилось?, но ответа также нет. По-моему, это возможно. Вот рабочий пример для 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)) }
}

Ответ 4

Другой способ написать ответ theons заключается в использовании:

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