How to apply a function to a tuple?

后端 未结 5 1818
迷失自我
迷失自我 2020-11-29 22:56

This should be an easy one. How do I apply a function to a tuple in Scala? Viz:

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

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


        
相关标签:
5条回答
  • 2020-11-29 23:21

    In Scala 2.8 and newer:

    scala> def f (i : Int, j : Int) = i + j
    f: (i: Int,j: Int)Int
    
    // Note the underscore after the f
    scala> val ff = f _
    ff: (Int, Int) => Int = <function2>
    
    scala> val fft = ff.tupled
    fft: ((Int, Int)) => Int = <function1>
    

    In Scala 2.7:

    scala> def f (i : Int, j : Int) = i + j
    f: (Int,Int)Int
    
    // Note the underscore after the f
    scala> val ff = f _
    ff: (Int, Int) => Int = <function>
    
    scala> val fft = Function.tupled(ff)
    fft: ((Int, Int)) => Int = <function>
    
    0 讨论(0)
  • 2020-11-29 23:28

    In Scala 3, you can use TupledFunction:

    For a single use, you can do

    summon[TupledFunction[(Int, Int) => Int, ((Int, Int)) => Int]].tupled(f)((2, 3))
    

    To make it easier to use, you can use an extension (copied from Dotty's own documentation)

    extension [F, T <: Tuple, R](f: F)(using tf: TupledFunction[F, T => R])
      def tupled(t: T): R = tf.tupled(f)(t)
    

    And then you can do f.tupled((2, 3)) to get 5.

    0 讨论(0)
  • 2020-11-29 23:34

    Scala 2.13

    def f (i : Int, j : Int) = i + j
    
    import scala.util.chaining._
    (3,4).pipe((f _).tupled)   //res0: Int = 7
    
    0 讨论(0)
  • 2020-11-29 23:37

    Following up on the other answer, one could write (tested with 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
    

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

    Creates a tupled version of this function: instead of 2 arguments, it accepts a single scala.Tuple2 argument.

    0 讨论(0)
  • 2020-11-29 23:41
    scala> def f (i: Int, j: Int) = i + j
    f: (i: Int, j: Int)Int
    scala> val p = (3,4)
    p: (Int, Int) = (3,4)
    scala> val ft = (f _).tupled
    ft: ((Int, Int)) => Int = <function1>
    scala> ft apply(p)
    res0: Int = 7
    
    0 讨论(0)
提交回复
热议问题