2009-10-09 3 views

Antwort

44

Nun ... f() nimmt einen String als Parameter. Das Konstrukt _.toString hat den Typ A <: Any => String. Die Funktion f() erwartet einen Typ von String, daher wird im obigen Beispiel keine Prüfung durchgeführt. Es scheint, dass Scala in diesem Fall freundlich ist und dem Benutzer eine weitere Chance gibt. Die Fehlermeldung bedeutet: "Bei meinen Typ-Inferenz-Algorithmen kompiliert sich das nicht. Setze die Typen ein und es könnte, wenn es etwas ist, was ich nicht ableiten kann."

Sie müssten die anonyme Funktion in diesem Fall longhand schreiben, d. H. a.map(n => f(n.toString)). Dies ist keine Beschränkung der Typinferenz, sondern des Platzhaltersymbols. Grundsätzlich, wenn Sie a.map(f(_.toString)) schreiben, wird die _.toString in eine anonyme Funktion innerhalb der nächsten Klammern erweitert, die es finden kann, sonst würde dies zu einer enormen Mehrdeutigkeit führen. Stellen Sie sich etwas wie f(g(_.toString)) vor. Bedeutet dies f(g(x => x.toString)) oder f(x => g(x.toString))? Schlechtere Ambiguitäten würden für mehrere verschachtelte Funktionsaufrufe entstehen. Der Scala-Typ-Checker nimmt daher die logischste Lösung, wie oben beschrieben.

Nitpick: die erste Zeile Ihres Codes sollte val a = List(1,2,3,4) sein :).

Verwandte Themen