Wann ist eine Teilfunktion scala keine Teilfunktion?

8

Beim Erstellen einer Zuordnung von String zu Teilfunktionen kam es zu unerwartetem Verhalten. Wenn ich eine Teilfunktion als Map-Element erstelle, funktioniert es gut. Wenn ich es einem val zuweisen, ruft es stattdessen auf. Der Versuch, den Check aufzurufen, erzeugt einen Fehler. Wird das erwartet? Mache ich etwas dummes? Kommentiere das check() aus, um den Aufruf zu sehen. Ich benutze Scala 2.7.7

%Vor%     
Fred Haslam 20.05.2010, 04:34
quelle

2 Antworten

12

Aus Gründen der Bequemlichkeit können Sie in Scala beim Aufruf einer Methode leere Parens weglassen, aber es ist schlau genug, um zu sehen, dass der erwartete Typ im ersten Fall ()=>Unit ist, damit nicht alle Parens für Sie entfernt werden; Stattdessen konvertiert es die Methode in eine Funktion für Sie.

Im Fall val check sieht es jedoch so aus, als ob ein Funktionsaufrufergebnis einer Variablen zugewiesen wird. Tatsächlich machen alle drei genau dasselbe:

%Vor%

Wenn Sie die Methode in eine Funktion umwandeln möchten, platzieren Sie _ nach der Methode anstelle der Argumentliste (n) . Also,

%Vor%

wird tun, was Sie wollen.

    
Rex Kerr 20.05.2010, 04:49
quelle
5

Nun, das Problem ist, dass Sie alles falsch verstanden haben. : -)

Hier sind einige konzeptionelle Fehler:

%Vor%

Dies ist keine Teilfunktion. Dies ist eine Curry-Methode mit zwei leeren Parameterlisten, die Unit zurückgibt.

%Vor%

Der Typ der Werte in dieser Map ist keine Teilfunktion, sondern Funktion. Insbesondere Function0[Unit] . Eine Teilfunktion hätte den Typ PartialFunction[T, R] .

%Vor%

Was hier passiert, ist, dass Scala die partiell angewendete Methode in eine Funktion konvertiert. Dies ist keine einfache Aufgabe. Scala führt die Konvertierung durch, da der Typinterfere den richtigen Typ erraten kann.

%Vor%

Hier gibt es keinen erwarteten Typ, der dem Typinterferenzen hilft. Leere Parameterlisten können jedoch weggelassen werden. Dies ist also nur ein Methodenaufruf.

    
Daniel C. Sobral 20.05.2010 15:39
quelle