为什么{1}仅存在于Scala中的单个参数函数?
以下代码有效:
andThen
但为什么多参数函数没有val double = (x: Int) => x * 2
val timesFour = double andThen double
方法?
andThen
添加此方法肯定是微不足道的。有没有理由从标准库中省略它?
答案 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