Das Argument f
in Ihrer apply
Funktion ist eine Funcion1
, die einen Parameter vom Typ eines B
A
und gibt Call-by-Namen nimmt. Daher wird f(x)
den Aufruf-nach-Name-Parameter x
nicht auswerten, aber seine Referenz direkt an f
übergeben.
Es ist hilfreich, res
zu verstehen, wie folgt:
def res[C]: Int = apply[C, Int](const, ???)
wo in Ihrem Beispiel C
ein unspezifischer Art sein würde. Was ist der Typparameter für const
in dieser Zeile? Es ist => C
. Leider kann man nicht, dass der Parameter eingeben:
def res[C]: Int = apply[C, Int](const[=> C], ???) // illegal syntax
Aber können Sie überprüfen, was los ist:
def res[C]: Int = apply[C, Int](const[Nothing], ???)
geben Sie
<console>:10: error: type mismatch;
found : Nothing => Int
required: => C => Int
def res[C]: Int = apply[C, Int](const[Nothing], ???)
^
Diese Art erscheint innerhalb const
als Function0[Int]
(so Scala behandelt implizit Aufrufe von Namen oder "Thunk" -Argumente als eine Funktion ohne Argumente. Auch hier können Sie dies überprüfen:
def const[A](ignored: A): Int = if (ignored.isInstanceOf[Function0[_]]) 1 else 0
Jetzt Test.res
Sie 1
geben wird (was bedeutet, dass ignored
ist in der Tat ein Function0
).
So ist die Frage eine andere Art und Weise zu beantworten, hat const
ein eifriges Argument vom Typ A
, aber das tut hier keine Rolle, weil A
eine Funktion in Ihrem Beispiel wird, und Sie nie diese Funktion anwenden, deshalb ???
wird nie ausgeführt.
Es ist some debate zu why there is both A "Thunk" oder Klammern lose Funktion und eine leere-paren Funktion (Function0
) in Scala.
Ich denke, das könnte auf http://scalapuzzlers.com/ – ghik
Vielen Dank für die detaillierte Erklärung. Ist die Semantik des Bedarfs (die ich für meinen Namen hielt) in Scala irgendwo definiert? Typischerweise werden Strictness-Eigenschaften in Bezug auf die angewendete Funktion definiert (in diesem Fall "const"), aber Ihre Erklärung bezieht sich sehr stark auf die Implementierung und wie das Argument für "const" konstruiert wird. – tibbe
Eine weitere Frage, kann ein Typparameter "A" sowohl mit einem by-value-Argument (z. B. "Int") als auch mit einem by-neft-Argument (d. H. "=> Int")? – tibbe