2016-08-18 3 views
0

ich von Java kam und möchte zwei Teilfunktionen wie folgt kombinieren:Kombination Teilfunktionen

def sum(a: Int, b: Int, c: Int) : Int = a + b + c 

Ich möchte so etwas schreiben:

val l = List(1, 2, 3) 
l.foreach(println _ sum (1, _ : Int, 3)) // It's supposed to apply 
            // the partial sum(1, _: Int, 3) 
            // and println computed value. 

Aber es weigert sich, zu kompilieren. Gibt es eine Möglichkeit, es präzise zu beheben?

+0

Sie mischen teilweise ausgewertet Funktionen auf (so etwas wie 'f (1, _)') und Teilfunktionen. 'sum' ist eine totale Funktion, nicht partiell, das heißt für jedes Domänenelement der Funktion gibt es ein assoziiertes Element in seiner codomain. – pedrofurla

+0

@pedrofurla teilweise angewandte Funktion, rechts. Ich kann sie nicht komponieren, oder? – user3663882

+1

Die zweite Zeile ergibt keinen Sinn. Nicht sicher, dass es sich überhaupt lohnt zu erklären, warum. – pedrofurla

Antwort

2

Angenommen, ich lesen, was Sie richtig wollen (und auch der Code es ist eine große Annahme), hier ein Ausschnitt, die es erreichen könnte:

scala> def sum(a: Int, b: Int, c: Int) : Int = a + b + c 
sum: (a: Int, b: Int, c: Int)Int 

scala> val sum13 = sum(1, _ : Int, 3) 
sum13: Int => Int = <function1> 

scala> val printInt = println(_ : Int) 
printInt: Int => Unit = <function1> 

scala> List(1,2,4) foreach { printInt compose sum13 } 
5 
6 
8 

Beachten Sie die compose. Ein anderer Weg wäre explizit zu komponieren x => printInt(sum13(x)).

+0

Thatnks, aber warum funktioniert 'printFoo compose sum (1, _: Int, 3)' nicht? – user3663882

+2

@ user3663882 Explizite Klammern um die "Summe" versuchen – Bergi

3

Es gibt einige Probleme mit dem, was Sie versuchen zu tun. Zunächst einmal ist println eine überladene Methode, also, wenn Sie versuchen, eta-erweitert es zu einer Funktion wie diese println _ wird Scala die kürzeste Form annimmt, die die mit 0 Argumenten ist:

scala> println _ 
res0:() => Unit = $$Lambda$1048/[email protected] 

So Sie müssen genauer sein:

scala> println(_: Int) 
res1: Int => Unit = $$Lambda$1064/[email protected] 

Nun, da wir dort die korrekte Funktion haben, ist eine weitere Sache zu tun:

scala> l.foreach((println(_: Int)) compose (sum (1, _: Int, 3))) 
5 
6 
7 
: compose und richtige Klammern (zusätzliche Klammern wickeln anonyme Funktionen) hinzufügen

oder in der anderen Richtung:

scala> l.foreach((sum (1, _: Int, 3)) andThen (println(_: Int))) 
5 
6 
7 
+0

Schöne Erklärung, vielen Dank – user3663882