Scala 为什么';t函数2有第二种方法吗?
为什么Scala中的Scala 为什么';t函数2有第二种方法吗?,scala,function-composition,Scala,Function Composition,为什么Scala中的和只存在于单参数函数中 以下代码起作用: val double = (x: Int) => x * 2 val timesFour = double andThen double 但是为什么没有多参数函数的和第二个方法呢 val multiply = (x: Int, y: Int) => x * y val multiplyAndDouble = multiply andThen double <console>:10: error: value
和只存在于单参数函数中
以下代码起作用:
val double = (x: Int) => x * 2
val timesFour = double andThen double
但是为什么没有多参数函数的和第二个方法呢
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乘法=(x:Int,y:Int)=>x*y
val multiplyAndDouble=乘二次方
:10:错误:值,并且不是(Int,Int)=>Int的成员
当然,添加此方法很简单。标准库中省略它有什么原因吗?我无法解释为什么Function2
不提供和和和,但Scalaz为各种算术函数定义了函子
实例,其中映射
等价于和,这意味着您可以编写
val multiplyAndDouble = multiply map double
这里有一个类似的问题:
,但也没有答案。我认为这是可能的。下面是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)) }
}
我刚刚注意到,解决以下问题很容易:
val multiplyAndDouble = multiply.tupled andThen double
val res = multiplyAndDouble(1, 3) // res = 6
另一种写theons答案的方法是:
val multiplyAndDouble = double compose multiply.tupled
val result = multiplyAndDouble(2, 6) // res 24
相关:在执行一个函数后,不能返回多个“thing”,因此如何为函数提供两个参数multiply
?可以弥补这一差距,但将tuple
应用于函数N
(对于大于1的N)然后得到一个函数1
,它需要一个TupleN
@vptheron,我说的是另一种方式。应用Function2
,然后应用Function1
@senia返回的单个结果谢谢链接。