2014-01-07 13 views

Antwort

4

Beachten Sie Folgendes:

def list1 = { println("1st list!"); List(1, 2, 3) } 
def list2 = { println("2nd list!"); List(4, 5) } 
def empty = { println("Empty string!"); "" } 

Und dann:

scala> val foo = (list1 ++ list2).foldLeft(empty) _ 
Empty string! 
1st list! 
2nd list! 
foo: ((String, Int) => String) => String = <function1> 

Hier (list1 ++ list2).foldLeft(empty) ist der Ausdruck der Methodentyp und list1 ++ list2 und empty sind seine maximale Unterausdrücke, die ihr gerade buchstäblich größte konstituierende Ausdrücke. Wir verwenden _, um eine Erweiterung zu erzwingen, aber in einigen Kontexten wäre das nicht notwendig.

Es macht Sinn, dass wir würden list1 ++ list2 nicht wollen, jedes Mal wenn wir die Funktion foo verwenden, zum Beispiel ausgewertet werden, und das ist, was die in §6.26.5 beschriebenen Umwandlung erreicht-es stellt sicher, dass die Unterausdrücke ist einmal bewertet und gespeichert, bevor die Funktion erstellt wird.

Wenn wir die REPL mit -print angefangen hatte, würden wir die folgende (umformatiert für Klarheit) gesehen haben:

$read$$iw$$iw.this.foo = { 
    <synthetic> val eta$0$1: String = $line5.$read$$iw$$iw.empty(); 
    <synthetic> val eta$1$1: List = $line3.$read$$iw$$iw.list1().++(
    $line4.$read$$iw$$iw.list2(), 
    immutable.this.List.canBuildFrom() 
).$asInstanceOf[List](); 
    { 
    (new anonymous class anonfun$1(eta$0$1, eta$1$1): Function1) 
    } 
}; 

Wenn Sie sich fragen, jemals, was genau ein Unterausdruck in einem bestimmten darstellt Situation, dies ist eine einfache Möglichkeit zu überprüfen - nur nach den Zeilen beginnend mit <synthetic> val suchen.

+0

"die nur buchstäblich ihre größten konstituierenden Ausdrücke sind." immer noch ein bisschen vage, denke ich. Ist es richtig zu sagen, dass, wenn wir reines FP hätten, dies foldLeft (list1 ++ list2) (leer) _ entsprechen würde, daher ist ++ (list1, list2) der maximale Ausdruck in Abhängigkeit von zwei kleineren Teilausdrücken (list1 und list1) Liste2)? – Felix

+0

Ist es auch völlig abwegig zu sagen, dass dies meistens einfach die Argumentationsausdrücke in ihrer Gesamtheit sein werden? – Felix

+1

Die Idee von "Methodentypen", die nicht als Typen von Werten existieren (und "Ausdrücke von Methodentypen", die diese Art von Konvertierung als Werte benötigen), ist in erster Linie ziemlich weit von reinem FP entfernt. In Ihrem reinen FP-Beispiel ist "foldLeft" bereits eine Funktion, und diese Art der Konvertierung ist nicht erforderlich. Im Allgemeinen werden die maximalen Sub-Ausdrücke der Ausdruck sein, dass die Methode zusammen mit irgendwelchen Argumenten in anderen Parameter-Listen aufgerufen wird. –