Die von Kevin Wright gegebene Antwort ist völlig richtig, aber ich möchte sie noch weiter aufschlüsseln:
Die erste Zeile deklariert eine Funktion namens foo
. foo
nimmt als Argument eine andere Funktion, bar
die ihrerseits die Unit
und gibt eine String
. Ganz allgemein gesprochen, Unit
hat in Scala die gleiche Bedeutung wie void
in vielen anderen Sprachen, man könnte also sagen, dass die meisten bar
ist eine Funktion, die keine Argumente entgegennimmt und eine String
.
Der Körper des foo
Funktion gibt einfach das empfangene Argument zurück. Daher folgert scala, dass foo
gibt eine Funktion zurück, die Unit
und gibt eine String
.
Der zweite Befehl ruft foo
mit der Funktion a => a.toString
als sein Argument. a
wird angenommen, dass sie vom Typ Unit
. Wenn Unit
war ein genaues Analogon zu void
würde dies nicht funktionieren. Sie können nicht anrufen toString
über die Abwesenheit von etwas. Wie auch immer, Unit
verhält sich genau für solche Situationen etwas anders, und a
erhält eine Instanz von Unit
. Diese Instanz wird nicht wirklich viel tun können, aber sie wird in der Lage sein toString
angerufen. Das Ergebnis des zweiten Befehls wird also eine Funktion sein, die das Ergebnis von toString
aufgerufen am Unit
Instanz, die lautet: "()"