Einige Fragen zum Unterschied zwischen Call-by-Name- und 0-Arity-Funktionen

8

Es gibt einige Diskussionen hierüber, aber ich habe einige spezifische Fragen, auf die ich keine Antwort finden konnte. Also, bei call-by-name meine ich =>T type und bei 0-arity function meine ich () => T

Ich verstehe (denke ich) den konzeptionellen Unterschied, aber wahrscheinlich vermisse ich etwas, da ich noch viele Fragen habe:

  1. Warum haben wir überhaupt das Konzept von =>T , wenn wir immer () => T verwenden könnten?
  2. Gibt es irgendwelche Syntax- / Funktionsbeschränkungen von jedem? Für den Moment habe ich nur gefunden, dass => nicht als Klassenfeld verwendet werden kann. Ist das die einzige Einschränkung?
  3. Ist der generierte Code für beide immer gleich?
  4. Soll ich immer =>T bevorzugen? Und warum?
  5. Ist es richtig, =>T als Typ anzugeben? Es sieht für mich so aus, als hätte es in scala keine Typendarstellung.
Archeg 26.09.2015, 21:16
quelle

1 Antwort

7

1) Es ist einfach praktischer, es zu benutzen, besonders innerhalb von DSLs:

%Vor%

2) => T kann nur ein Parameter der Methode oder Funktion sein. Und tatsächlich sind => T und () => T nicht austauschbar:

%Vor%

Danke an @ som-snytt, für diesen:

%Vor%

Auch das sollte funktionieren, wenn es kompiliert wird - aber nicht (scala 2.11.2, 2.11.5 REPL stürzt einfach ab):

%Vor%

Der letzte scheint wie ein Fehler

3) Nicht genau, wenn Sie das gleiche wollen, konvertieren Sie => T in () => T :

%Vor%

Bytecode kann auch abweichen. Zum Beispiel wird der Compiler eher Code aus => T inline schreiben, ohne dafür Lambda zu erzeugen. Der entscheidende Unterschied ist also, dass () => T tatsächlich ein Objekt ist (Bürger erster Klasse), => T nicht.

4) siehe 1, aber manchmal müssen Sie möglicherweise sicherstellen, dass der Benutzer weiß, dass die Berechnung möglicherweise verzögert wird - () => T ist dann besser.

5) Es ist Teil einer Typ-Signatur, schaue dir einfach eta-expansion von:

an %Vor%

Scala erkennt es jedoch nicht als unabhängigen Typ:

%Vor%     
dk14 26.09.2015, 23:09
quelle

Tags und Links