2017-08-16 4 views
0

Ich bin nach einem Kurs von Coursera wo dieses Beispiel in der Vorlesung erscheint, aber wenn ich versuche, und führen Sie es, wirft er einen Fehler wie folgt:Verständnis Scala Currying

fehlende Argument Liste für Methode verkleinert in Objekt Hello World

Nicht angewendete Methoden werden nur in Funktionen konvertiert, wenn ein Funktionstyp erwartet wird. Sie können diese Konvertierung explizit machen, indem Sie mapReduce _ oder mapReduce(_,_,_)(_,_) anstelle von mapReduce schreiben.

var doo = verkleinern (x => x (x, y) => x * y, 0)

Unten ist der Code, den ich ausführen wollen.

Antwort

1

Um eine Curry-Funktion zu erstellen, müssen Sie einen Unscore-Parameter definieren. Wie folgt aus:

scala> var doo = mapReduce(x => x, (x,y)=>x*y, 0) _ 
doo: (Int, Int) => Int = <function2> 

scala> println(doo(1,4)) 
0 
3

mapReduce will zwei Argumentlisten, aber Sie geben sie ein. Try this:

val doo = mapReduce(x => x, (x,y) => x*y, 0) _ 

oder äquivalent steht

val doo = mapReduce(identity, _*_, 0) _ 

Die _ am Ende für das zweite Argument-Liste. Es teilt dem Compiler mit, dass der Suffixwert als ein funktionaler Wert und nicht als ein auszuwertender Ausdruck verwendet werden soll.

Sie können auch Compiler geben einen Hinweis auf die Umwandlung automatisch durch explizit erklärt den erwarteten Typ des expession geschehen:

val doo: (Int, Int) => Int = mapReduce(identity, _*_, 0) 

Und nicht verwenden vars. Sie sind böse. Tu einfach so, es gibt kein solches Schlüsselwort in scala, bis du genug von der Sprache lernst, um die extrem seltenen Fälle erkennen zu können, wenn es wirklich benötigt wird.

+0

Dank das Hinzufügen eines Unterstrichs funktioniert: D Magisch – pannu