Ich lese die Buchprogrammierung in Scala und es heißt:
... in diesem Fall wird als Nebeneffekt auf den Standardausgabestream gedruckt.
und ich sehe nicht, wo der Nebeneffekt liegt, da println für dieselbe Eingabe dieselbe Ausgabe druckt (glaube ich),
zum Beispiel jedes Mal, wenn wir Folgendes
aufrufen:
UPDATE
:
println(5)
es wird 5 gedruckt , ich sehe keinen Fall, in dem ein Aufruf println(5)
einen anderen Wert als 5 druckt !!
scala
functional-programming
pure-function
ein Name
quelle
quelle
println
ist eine deterministische Funktion, aber um rein zu sein, muss es auch RT sein.Antworten:
Sie können feststellen, ob ein Ausdruck eine Nebenwirkung hat, indem Sie den Ausdruck durch sein Ergebnis ersetzen. Wenn das Programm seine Bedeutung ändert , tritt ein Nebeneffekt auf. Zum Beispiel,
ist ein anderes Programm als
Das heißt, ein Nebeneffekt ist ein beobachtbarer Effekt, der im Ergebnis der Auswertung eines Ausdrucks nicht codiert wird. Hier ist das Ergebnis
()
, aber nichts in diesem Wert kodiert die Tatsache, dass 5 jetzt irgendwo auf Ihrem Bildschirm angezeigt wurde.quelle
val a = println("hello"); val b = (a, a)
sollte eher dasselbe sein wieval b = (pritnln("hello"), println("hello"))
.println(5)
und hin()
. Oder meintest du den letzten Satz?x = 1
undx = 1; x = 1; x = 1
?Betrachten Sie die folgende Analogie
Dies
myprintln
ist unrein, da neben der Rückgabe des Werts()
auch eine nicht lokale Variableout
als Nebeneffekt mutiert wird . Stellen Sieout
sich nun vor , der Strom Vanilleprintln
mutiert.quelle
()
auch den nicht-lokalen Status in mutiertSystem.out
.Die Nebenwirkung liegt im Zustand des Computers. Bei jedem Aufruf
println()
ändert sich der Speicherstatus, um dem Terminal den angegebenen Wert anzuzeigen. Oder allgemeiner wird der Status des Standardausgabestreams geändert.quelle
Auf diese Frage wurden bereits nette Antworten gegeben, aber lassen Sie mich meine zwei Cent hinzufügen.
Wenn Sie sich die
println
Funktion im Wesentlichen ansehen , ist dies dasselbe wiejava.lang.System.out.println()
- Wenn Sie also die Standardbibliotheksmethode von Scalaprintln
unter der Haube aufrufen, wird eine Methodeprintln
für einePrintStream
Objektinstanz aufgerufen, die als Feldout
in derSystem
Klasse (oder genaueroutVar
inConsole
Objekt) deklariert ist , wodurch der interne Status geändert wird . Dies kann als eine weitere Erklärung angesehen werden, warumprintln
eine unreine Funktion vorliegt.Hoffe das hilft!
quelle
Es hat mit dem Konzept der referenziellen Transparenz zu tun . Ein Ausdruck ist referenziell transparent, wenn Sie ihn durch das ausgewertete Ergebnis ersetzen können, ohne das Programm zu ändern .
Wenn ein Ausdruck nicht referenziell transparent ist, sagen wir, dass er Nebenwirkungen hat .
während
Eine ausführlichere Erklärung finden Sie hier: https://typelevel.org/blog/2017/05/02/io-monad-for-cats.html
quelle
f(println("effect"), println("effect"))
wird zweimal im Konsoleneffektval x = println("effect");f(x,x)
gedruckt, während einmal gedruckt wird.