Estou lendo o livro de programação em scala, e diz-se:
... neste caso, seu efeito colateral é imprimir no fluxo de saída padrão.
e não vejo onde está o efeito colateral, pois, para a mesma entrada, println imprimirá a mesma saída (acho)
UPDATE,
por exemplo, sempre que chamarmos:
println(5)
ele imprimirá 5 , não vejo um caso em que a chamada println(5)
imprima um valor diferente de 5 !!
println
é uma função determinística, mas, para ser pura, também deve ser RT.Respostas:
Você pode dizer se uma expressão tem um efeito colateral substituindo a expressão pelo seu resultado. Se o programa mudar de significado , há um efeito colateral. Por exemplo,
é um programa diferente para
Ou seja, um efeito colateral é qualquer efeito observável que não é codificado no resultado da avaliação de uma expressão. Aqui está o resultado
()
, mas não há nada nesse valor que codifique o fato de que 5 agora apareceu em algum lugar da tela.fonte
val a = println("hello"); val b = (a, a)
deve ser o mesmo queval b = (pritnln("hello"), println("hello"))
.println(5)
e()
. Ou você quis dizer a última frase?x = 1
ex = 1; x = 1; x = 1
?Considere a seguinte analogia
Aqui
myprintln
está impuro porque, além do valor retornado,()
ele também altera a variável não localout
como efeito colateral. Agora imagineout
ser o fluxo que a baunilhaprintln
sofre mutação.fonte
()
, também altera o estado não local emSystem.out
.O efeito colateral está no estado do computador. Cada vez que você chama,
println()
o estado da memória muda para exibir um determinado valor ao terminal. Ou, geralmente, o estado do fluxo de saída padrão é alterado.fonte
Respostas legais já foram dadas a essa pergunta, mas deixe-me acrescentar meus dois centavos.
Se você olhar para dentro da
println
função, essencialmente é o mesmo quejava.lang.System.out.println()
- portanto, quando você chama oprintln
método de biblioteca padrão do Scala sob o capô, ele invoca o métodoprintln
naPrintStream
instância do objeto que é declarada como campoout
naSystem
classe (ou mais precisamenteoutVar
noConsole
objeto), o que altera o estado interno . Isso pode ser considerado como outra explicação porque aprintln
função é impura.Espero que isto ajude!
fonte
Tem a ver com o conceito de transparência referencial . Uma expressão é referencialmente transparente se você puder substituí-la pelo resultado avaliado sem alterar o programa .
Quando uma expressão não é referencialmente transparente, dizemos que ela tem efeitos colaterais .
enquanto
Você pode encontrar uma explicação mais detalhada aqui: https://typelevel.org/blog/2017/05/02/io-monad-for-cats.html
fonte
f(println("effect"), println("effect"))
vai imprimir duas vezes no console "effect" enquantoval x = println("effect");f(x,x)
vai imprimir uma vez.