2015-02-17 1 views
5

Supponiamo che io ho due funzioni f e g:andthen per la funzione di due argomenti a Scala

val f: (Int, Int) => Int = _ + _ 
val g: Int => String = _ + "" 

Ora vorrei comporli con andThen per ottenere una funzione h

val h: (Int, Int) => String = f andThen g 

Purtroppo non compila :(

scala> val h = (f andThen g) 
<console> error: value andThen is not a member of (Int, Int) => Int 
    val h = (f andThen g) 

Perché non compila e come posso comporre f e g per ottenere (Int, Int) => String?

+2

Eventuali duplicati di [Perché non Function2 dispone di un metodo di andthen?] (Https://stackoverflow.com/questions/21680117/why-doesnt-function2-have-an-andthen-method) – theon

risposta

9

Esso non viene compilato perché andThen è un metodo di Function1 (in funzione di un parametro: vedi la scaladoc).

La funzione f ha due parametri, quindi sarebbe un'istanza di Function2 (vedere scaladoc).

Per farlo compilare, è necessario trasformare f in una funzione di un parametro, per tupling:

scala> val h = f.tupled andThen g 
h: (Int, Int) => String = <function1> 

prova:

scala> val t = (1,1) 
scala> h(t) 
res1: String = 2 

puoi scrivere anche la chiamata a h più semplicemente a causa di auto-tupling, senza creare esplicitamente una tupla (sebbene l'auto-tupling sia un po 'controverso a causa del suo potenziale di confusione e perdita di sicurezza del tipo):

scala> h(1,1) 
res1: String = 2 
+0

Grazie! Probabilmente userò 'tupled'. – Michael

6

Function2 non ha un metodo andThen.

Si possono comporre manualmente, però:

val h: (Int, Int) => String = { (x, y) => g(f(x,y)) }