2010-01-01 6 views
39

Cela devrait être facile. Comment appliquer une fonction à un tuple dans Scala? Viz:Comment appliquer une fonction à un tuple?

 
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! 

Merci beaucoup à l'avance.

Répondre

55

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> 

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> 
+1

intéressant de noter, scala (2.11.0 ici) apportera vos params untupled jusqu'à un tuple si vous: 'fft.apply (1,2)' – ThaDon

+0

Bon à savoir que vous pouvez faire , mais cela ne semble pas beaucoup plus court que d'utiliser 'function (tup._1, tup._2)' en premier lieu –

+3

@AllenWang Je pense que le point important est que 'tupled' peut être utilisé pour n'importe quelle arité. Bon pour la maintenabilité. – Ohashi

8

Faisant suite à l'autre réponse, on pourrait écrire (testé avec 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 

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

Crée une version triplée de cette fonction: au lieu de 2 arguments, accepte un seul argument scala.Tuple2.

0
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 
Questions connexes