如何将函数应用于元组?

Joh*_*nts 44 scala

这应该很简单.如何将函数应用于Scala中的元组?即:

scala> def f (i : Int, j : Int) = i + j
f: (Int,Int)Int

scala> val p = (3,4)
p: (Int, Int) = (3,4)

scala> f p
:6: error: missing arguments for method f in object $iw;
follow this method with `_' if you want to treat it as a partially applied function
       f p
       ^

scala> f _ p
:6: error: value p is not a member of (Int, Int) => Int
       f _ p
           ^

scala> (f _) p
:6: error: value p is not a member of (Int, Int) => Int
       (f _) p
             ^

scala> f(p)
:7: error: wrong number of arguments for method f: (Int,Int)Int
       f(p)
       ^

scala> grr!

提前谢谢了.

Ran*_*ulz 60

在Scala 2.7中:

scala> def f (i : Int, j : Int) = i + j
f: (Int,Int)Int

scala> val ff = f _
ff: (Int, Int) => Int = <function>

scala> val fft = Function.tupled(ff)
fft: ((Int, Int)) => Int = <function>
Run Code Online (Sandbox Code Playgroud)

在Scala 2.8中:

scala> def f (i : Int, j : Int) = i + j
f: (i: Int,j: Int)Int

scala> val ff = f _
ff: (Int, Int) => Int = <function2>

scala> val fft = ff.tupled
fft: ((Int, Int)) => Int = <function1>
Run Code Online (Sandbox Code Playgroud)

  • @AllenWang我认为重要的一点是`tupled`可以用于任何arity.有利于可维护性. (3认同)

Jac*_*ski 14

跟进另一个答案,可以写(用2.11.4测试):

scala> def f (i: Int, j: Int) = i + j
f: (i: Int, j: Int)Int

scala> val ff = f _
ff: (Int, Int) => Int = <function2>

scala> val p = (3,4)
p: (Int, Int) = (3,4)

scala> ff.tupled(p)
res0: Int = 7
Run Code Online (Sandbox Code Playgroud)

def tupled:((T1,T2))⇒R:

创建此函数的tupled版本:它接受单个scala.Tuple2参数,而不是2个参数.


jwv*_*wvh 7

斯卡拉2.13

def f (i : Int, j : Int) = i + j

import scala.util.chaining._
(3,4).pipe((f _).tupled)   //res0: Int = 7
Run Code Online (Sandbox Code Playgroud)

  • 感谢您的回答,但添加一些解释也许可以帮助更多人 (2认同)