2016-07-03 22 views
2

Was genau ist der Unterschied zwischen . und beim Aufruf von Funktionen aus Objekten in Scala?Unterschied zwischen Punkt und Leerzeichen in Scala

Aus irgendeinem Grund bekomme ich Variationen, wie:

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

scala> l foldLeft(0)((hd, nxt) => hd + nxt) 
<console>:13: error: Int(1) does not take parameters 
     | foldLeft(1)((hd, nxt) => hd + nxt) 
        ^
scala>l.foldLeft(0)((hd, nxt) => hd + nxt) 
res2: Int = 2 

(Und während ich es bin, was ist der Name dieser Operation ich die strenge Definition des . Betreiber zu finden, versuchte immer wieder, und? ich habe keine Ahnung, wie es heißt.)

+0

Ein Ausdruck, der ein '.' enthält, wird als [" selection "] (http://scala-lang.org/files/archive/spec/2.11/06-expressions.html#designators) bezeichnet Es ist der "Auswahl-Operator", wenn Sie möchten. –

Antwort

4

mit Raum statt Punkt Postfixnotation genannt wird, wenn es keine Argumente in der aufgerufenen Funktion auf dem Objekt sind, oder Infixschreibweise, wenn es ein Argument ist, dass die Funktion erfordert.

Postix Beispiel: l sum, das entspricht l.sum

Infix Beispiel: l map (_ * 2), das entspricht l.map(_ * 2)

Das Problem mit diesen Bezeichnungen ist, dass sie in ihrer Interpretation von Natur aus mehrdeutig sind. Ein klassisches Beispiel aus der Mathematik:

  • 1 + 2 * 3 + 4 ist zweideutig und hängt von der Priorität der Operatoren ab.
  • . 1 + (2 *. (3). + (4) nur ein sinnvolle Interpretation.

Daher ist es nicht ein anderer Operator, aber die gleiche wie der Punkt, dass, nur anfällig für Mehrdeutigkeit . kann dazu führen, syntaktische Fehler wie der Fall sein oder noch schlimmer logische Fehler, wenn Sie Infixoperatoren Kette

können Sie eigentlich ausdrücken foldLeft mit Infixschreibweise auf diese Weise:

(l foldLeft 0)((hd, nxt) => hd + nxt) 

oder sogar

(0 /: l)((hd, nxt) => hd + nxt) 

Wo /: für foldLeft nur ein Alias ​​ist und nutzt die einzigartigen Semantik des Operators in Kolon endet (:), die als l./:(0) (die Umkehrung der üblichen interpretiert werden).

0

Desugar it mit "-Xprint:parser" oder "-Xprint:typer"

Beispiel 1 zu:

scala> (List(1,2) foldLeft 0)((hd, nxt) => hd + nxt) 
... 
List(1, 2).foldLeft(0)(((hd, nxt) => hd.$plus(nxt))) 
... 
immutable.this.List.apply[Int](1, 2).foldLeft[Int](0)(((hd: Int, nxt: Int) => hd.+(nxt))); 

Wie Sie sehen können, übersetzt (List(1,2) foldLeft 0) in (List(1, 2).foldLeft(0)) in der Parser-Phase. Dieser Ausdruck gibt eine Curry-Funktion zurück, die den zweiten Satz von Klammern verwendet, um ein Ergebnis zu erzeugen (denken Sie daran, dass eine Curry-Funktion nur eine Funktion ist, die ein Argument übernimmt und eine andere Funktion mit einem Argument weniger zurückgibt).

Beispiel 2 zu:

scala> List(1,2) foldLeft(0)((hd, nxt) => hd + nxt) 
... 
List(1, 2)(foldLeft(0)(((hd, nxt) => hd.$plus(nxt)))) 
... 
<console>:8: error: not found: value foldLeft 
      List(1,2) (foldLeft(0)((hd, nxt) => hd + nxt)) 

Die Klammern werden um (foldLeft(0)((hd, nxt) => hd + nxt)) gehen.

Stil:

Die Art und Weise Sie sollen durch Leerzeichen getrennte Methoden verwenden, ist ein Objekt von 1 Methode 1 Satz Klammern gefolgt gefolgt, die ein neues Objekt erzeugt, das durch eine neue Methode verfolgt werden kann.

obj method paramerer // good 

obj method1 paramerer1 method2 paramerer2 // good 

obj method1 paramerer1 method2 paramerer2 method3 paramerer3 // compiles, but might need to be broken up 

Sie können ein Objekt mit Postfix ein Verfahren folgen, die keine Parameter, aber das ist nicht immer der Stil genehmigt, vor allem für Accessoren.

foo.length // good 

foo length // compiles, but can be confusing. 

Raum begrenzt Methoden werden in der Regel entweder reine Funktionen (wie Karte, flatmap, Filter) oder für domänenspezifische Sprachen (DSL) reserviert.

Im Fall von foo.length gibt es keine () auf length, so dass der Leerraum nicht notwendig ist, um die Idee zu vermitteln, dass die Länge rein ist.

+0

Okay, aber warum funktioniert die zweite Funktion, wenn die erste nicht funktioniert? – linkhyrule5

Verwandte Themen