Je lis la programmation du livre dans 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, puisque, pour la même entrée, println imprimera la même sortie (je pense)
MISE À JOUR
par exemple chaque fois que nous appelons:
println(5)
il affichera 5, je ne vois pas de cas où l'appel de println(5)
affichera une valeur autre que 5 !!
De belles 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 fonction println
, c'est essentiellement la même chose que Java.lang.System.out.println()
- donc lorsque vous invoquez la méthode standard de la bibliothèque println
de Scala, elle invoque la méthode println
sur PrintStream
instance d'objet qui est déclarée comme champ out
dans System
class (ou plus précisément outVar
dans Console
objet), ce qui change son état interne. Cela peut être considéré comme une autre explication pour laquelle println
est une fonction impure.
J'espère que cela t'aides!
Cela a à voir avec le 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 transparente référentiellement, nous disons qu'elle a effets secondaires.
f(println("effect"), println("effect"))
// isn't really equivalent to!
val x = println("effect")
f(x, x)
tandis que
import cats.effect.IO
def printlnIO(line: String): IO[Unit] = IO(println(line))
f(printlnIO("effect"), printlnIO("effect"))
// is equivalent to
val x = printlnIO("effect")
f(x, x)
Vous pouvez trouver une explication plus détaillée ici: https://typelevel.org/blog/2017/05/02/io-monad-for-cats.html