Ответ 1
Я только что заметил, что легко обойти со следующим:
val multiplyAndDouble = multiply.tupled andThen double
val res = multiplyAndDouble(1, 3) // res = 6
Почему 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
Конечно, добавить этот метод тривиально. Есть ли причина, по которой он был исключен из стандартной библиотеки?
Я только что заметил, что легко обойти со следующим:
val multiplyAndDouble = multiply.tupled andThen double
val res = multiplyAndDouble(1, 3) // res = 6
Я не могу сказать, почему Function2
не предоставляет и andThen
, но Scalaz определяет экземпляры Functor
для функций различных arities, где map
эквивалентно andThen
, что означает, что вы можете писать
val multiplyAndDouble = multiply map double
Здесь есть аналогичный вопрос: 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)) }
}
Другой способ написать ответ theons заключается в использовании:
val multiplyAndDouble = double compose multiply.tupled
val result = multiplyAndDouble(2, 6) // res 24