2015-02-17 6 views
5

Angenommen, ich habe zwei Funktionen f und g:andthen für die Funktion von zwei Argumenten in Scala

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

Nun würde Ich mag sie eine Funktion h

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

Leider ist es zu bekommen mit andThen komponieren kompiliert nicht :(

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

Warum kompiliert es nicht und wie kann ich f und g zusammensetzen, um (Int, Int) => String zu bekommen?

+2

Mögliche Duplikate von [Warum hat Function2 keine andThen-Methode?] (Https://stackoverflow.com/questions/21680117/why-doesnt-function2-have-an-andthen-method) – theon

Antwort

9

Es kompiliert nicht, weil andThen ein Verfahren zur Herstellung Function1 ist (eine Funktion von einem Parameter: die scaladoc sehen).

Ihre Funktion f hat zwei Parameter, so würde eine Instanz Function2 (siehe scaladoc) sein.

Um es zu kompilieren, müssen Sie f in Abhängigkeit von einem Parameter verwandeln, durch fache Vervielfachung:

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

Test:

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

Sie können auch den Aufruf von h schreiben mehr einfach wegen auto-tupling, ohne explizit ein Tupel zu erstellen (obwohl Auto-tupling ist ein wenig umstritten wegen seiner Möglichkeit für Verwirrung und Verlust der Typ-Sicherheit):

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

Vielen Dank! Ich werde wahrscheinlich 'tupled' verwenden. – Michael

6

Function2 hat keine andThen Methode.

Sie können sie manuell zusammenstellen, aber:

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