Je lis la programmation du livre en scala, et il est dit:
... dans ce cas, son effet secondaire est l'impression sur le flux de sortie standard.
et je ne vois pas où est l'effet secondaire, car, pour la même entrée, println imprimera la même sortie (je pense)
UPDATE
par exemple chaque fois que nous appelons:
println(5)
il affichera 5 , je ne vois pas de cas où appeler println(5)
affichera une valeur autre que 5 !!
println
est une fonction déterministe mais pour être pure elle doit aussi être RT.Réponses:
Vous pouvez savoir si une expression a un effet secondaire en remplaçant l'expression par son résultat. Si le programme change de sens , il y a un effet secondaire. Par exemple,
est un programme différent de
Autrement dit, un effet secondaire est tout effet observable qui n'est pas codé dans le résultat de l'évaluation d'une expression. Voici le résultat
()
, mais il n'y a rien dans cette valeur qui code le fait que 5 est maintenant apparu quelque part sur votre écran.la source
val a = println("hello"); val b = (a, a)
devrait être la même chose queval b = (pritnln("hello"), println("hello"))
.println(5)
et()
. Ou vouliez-vous dire la dernière phrase?x = 1
etx = 1; x = 1; x = 1
?Considérez l'analogie suivante
Voici
myprintln
impur car en plus de renvoyer une valeur,()
il mute également une variable non localeout
comme effet secondaire. Imaginez maintenant queout
le flux de vanilleprintln
mute.la source
()
il mute également l'état non local dansSystem.out
.L'effet secondaire est dans l'état de l'ordinateur. Chaque fois que vous appelez,
println()
l'état de la mémoire change afin d'afficher la valeur donnée au terminal. Ou plus généralement, l'état du flux de sortie standard est modifié.la source
De bonnes réponses ont déjà été données à cette question, mais permettez-moi d'ajouter mes deux cents.
Si vous regardez à l'intérieur de la
println
fonction, c'est essentiellement la même chosejava.lang.System.out.println()
- donc lorsque vous appelez laprintln
méthode de bibliothèque standard de Scala sous le capot, elle appelle la méthodeprintln
sur l'PrintStream
instance d'objet qui est déclarée comme champout
dans laSystem
classe (ou plus précisémentoutVar
dansConsole
objet), ce qui change son état interne . Cela peut être considéré comme une autre explication de laprintln
fonction impure.J'espère que cela t'aides!
la source
Il s'agit du concept de transparence référentielle . Une expression est référentiellement transparente si vous pouvez la remplacer par son résultat évalué sans changer le programme .
Lorsqu'une expression n'est pas référentiellement transparente, nous disons qu'elle a des effets secondaires .
tandis que
Vous pouvez trouver une explication plus détaillée ici: https://typelevel.org/blog/2017/05/02/io-monad-for-cats.html
la source
f(println("effect"), println("effect"))
va imprimer deux fois dans la console "effet" tandis queval x = println("effect");f(x,x)
va imprimer une fois.