software - scala vs java
¿Cómo aplicar una función a una tupla? (3)
Esto debería ser fácil. ¿Cómo aplico una función a una tupla en Scala? Verbigracia:
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!
Muchas gracias de antemano.
En 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>
En 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>
Siguiendo con la otra respuesta, uno podría escribir (probado con 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
Ver def tupled: ((T1, T2)) ⇒ R :
Crea una versión tuplada de esta función: en lugar de 2 argumentos, acepta un único argumento scala.Tuple2 .
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