2012-10-15 8 views
10

Kann mir jemand erklären, warum ich diesen Compiler-Fehler für die folgende sehen, wenn ich die Punktnotation für die Anwendung des foldLeft Funktion? (Version 2.9.2)Warum verursacht das Auslassen des Punktes in foldLeft einen Kompilierungsfehler?

scala> val l = List(1, 2, 3) 
res19: List[Int] = List(1 ,2 ,3) 

scala> l foldLeft(1)(_ * _) 
<console>:9: error: Int(1) does not take parameters 
        l foldLeft(1)(_ * _) 
            ^

aber

scala> l.foldLeft(1)(_ * _) 
res27: Int = 6 

Diese doesn auslassen‘ t gilt für andere Funktionen höherer Ordnung wie map, die nicht kümmert, ob ich den Punkt liefern oder nicht.

Ich denke, die nicht über eine Sache Assoziativität, weil ich foldLeft(1)

Antwort

17

aufrufen kann nicht einfach Es ist, weil foldLeft curried ist. Neben der Punktnotation verwenden, können Sie auch dieses Problem beheben durch Zugabe von Klammern:

scala> (l foldLeft 1)(_ * _) 
res3: Int = 6 

Oh - und in Bezug auf Ihre Kommentare über nicht in der Lage zu sein foldLeft(l) aufrufen, können Sie, aber Sie müssen zum Teil es so gelten :

scala> (l foldLeft 1) _ 
res3: ((Int, Int) => Int) => Int = <function1> 
+0

danke Konstruktive Anmerkung, Die vollständige Antwort auf meine Frage lebt in dem ersten Kommentar, den Sie zu Regis 'Beitrag darüber gemacht haben, wie der Parser den Ausdruck angreift. – nsfyn55

3

den Punkt Weglassen ist möglich, weil der syntaktischen Unterstützung für die Infixschreibweise des scala, die 3 Teile erwartet:

leftOperand operator rightOperand. 

Aber weil foldLeft zwei Parameterlisten hatten, am Ende mit 4 Teilen auf syntaktischer Ebene nach oben: lfoldLeft(1)(_ * _)

Welche nicht Infixschreibweise paßt, damit die Fehler.

+0

Das könnte eine gute Faustregel sein, um zu verstehen, wann die Infix-Notation nützlich ist, aber ich bin mir nicht sicher, ob das völlig korrekt ist. Es ist möglich, 'foldLeft' mit der Infix-Notation aufzurufen (wie in meiner früheren Antwort gezeigt). Das Problem ist, dass der Parser "l faltet links (1) (_ * _)" als "l foldLeft ((1) (_ * _))" statt "(l foldLeft (1)) analysiert (_ * _) '. –

+0

Nun, Ihre Arbeit beweist tatsächlich meinen Standpunkt. Sie erzwingen die teilweise Anwendung von foldLeft, um 3 Teile zu haben, was die Infix-Notation ermöglicht. Das Ergebnis ist eine Funktion, die Sie sofort aufrufen. –

+0

Entschuldigung - das ist nur Pedanterie meinerseits, aber der Fehler ist nicht auf Infix-Notation vom Compiler abgelehnt. Das liegt daran, dass der Compiler versucht, '(_ * _)' auf '(1)' anzuwenden, was nicht möglich ist. –

Verwandte Themen