Implizite Konvertierungen für defs / lambdas in Scala?

8

Ich bin gerade in eine seltsame Disparität zwischen Funktionen und Objekten geraten (Scala 2.10):

%Vor%

Warum gibt es einen Unterschied zwischen Defs / Lambda Literalen und Lambda Vals?

Update: Offensichtlich tritt das Problem nicht für binäre Funktionen auf: Die implizite Konvertierung einer Funktion in eine Funktion zweiter Ordnung funktioniert nur, wenn die zu konvertierende Funktion mindestens zwei Parameter hat

Ich habe das überprüft, und tatsächlich funktioniert der folgende Code:

%Vor%

Ebenso stellen Nullfunktionen kein Problem dar:

%Vor%

Also, umformuliere die Frage: Warum funktioniert das nicht für UNARY Methoden und Funktionen?

Update: Das Problem hängt offenbar auch mit dem Zieltyp zusammen (der Typ von fs Argument h). Folgendes funktioniert auch (diesmal zugunsten von "Eta-Expansion zählt als Hop", weil wir einen Methodenwert aus einem using _)

erzeugen müssen %Vor%     
Björn Karge 11.02.2015, 09:07
quelle

1 Antwort

3

In scala defs sind methods und unterscheiden sich von functions .

%Vor%

Sie können method in function konvertieren, indem Sie sie teilweise anwenden.

%Vor%

Also ... du kannst,

%Vor%

Alse, wie @ srgfed01 in seinem Kommentar erwähnt ... für den zweiten Fall ist das Problem, dass ... sie Typen nicht explizit angegeben sind, wenn Sie den Typ richtig angeben ... der zweite Fall wird funktionieren.

%Vor%

oder

%Vor%

Nun zu den Unterschieden zwischen methods und functions ...

Sie können method ohne Argumente ohne Klammern () ... aufrufen, aber Sie können keine Funktion ohne () aufrufen.

%Vor%

Einer der wichtigsten Gründe dafür, dass methods sich von functions unterscheidet, liegt darin, dass die Entwickler von Scala eine nahtlose Interoperabilität mit Java anstrebten, ohne an den Einschränkungen von Java festzuhalten.

So methods ( def ) sind sehr ähnlich wie Java methods und% functions ist anders als methods aktiviert sie mit grenzenloser Freiheit Scala zu erstellen, so wie sie es wollten.

Auch ... Ein weiterer wichtiger Unterschied ist, dass methods Type-classes annehmen kann, wo functions nicht. Grundsätzlich können Sie generische methods like

haben %Vor%

Jetzt können Sie eine generische Methode definieren,

%Vor%

Aber Sie können eine Funktion wie diese nicht definieren,

%Vor%

oder wie das

%Vor%     
Sarvesh Kumar Singh 11.02.2015 13:21
quelle