Scala 为什么';t函数2有第二种方法吗?

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

为什么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 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返回的单个结果谢谢链接。