web-dev-qa-db-fra.com

Pourquoi println est-il considéré comme une fonction impure?

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 !!

10
aName

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!

2
Ivan Kurchenko

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

1
Didac Montero