Я читаю книгу программирования в Scala, и там сказано:
... в этом случае его побочным эффектом является печать в стандартный поток вывода.
и я не вижу, где находится побочный эффект, так как для того же ввода println будет печатать один и тот же вывод (я думаю)
UPDATE,
например, каждый раз, когда мы вызываем:
println(5)
он напечатает 5 , я не вижу случая, когда вызов println(5)
будет печатать значение, отличное от 5 !!
println
является детерминированной функцией, но для того, чтобы быть чистым, она также должна быть RT.Ответы:
Вы можете сказать, имеет ли выражение побочный эффект, заменив выражение его результатом. Если программа меняет смысл , есть побочный эффект. Например,
это другая программа
То есть побочный эффект - это любой наблюдаемый эффект, который не закодирован в результате вычисления выражения. Вот результат
()
, но в этом значении нет ничего, что кодировало бы тот факт, что 5 теперь появилось где-то на вашем экране.источник
val a = println("hello"); val b = (a, a)
должно быть то же самое, что иval b = (pritnln("hello"), println("hello"))
.println(5)
и()
. Или вы имели в виду последнее предложение?x = 1
иx = 1; x = 1; x = 1
?Рассмотрим следующую аналогию
Здесь
myprintln
нечисто, потому что помимо возвращаемого значения()
оно также изменяет нелокальную переменнуюout
в качестве побочного эффекта. Теперь представьте,out
что поток ванилиprintln
мутирует.источник
()
оно также изменяет нелокальное состояние вSystem.out
.Побочный эффект в состоянии компьютера. Каждый раз, когда вы вызываете,
println()
состояние памяти изменяется, чтобы отобразить заданное значение для терминала. Или, в более общем случае, состояние стандартного выходного потока изменяется.источник
Хорошие ответы уже были даны на этот вопрос, но позвольте мне добавить два моих цента.
Если вы загляните внутрь
println
функции по сути, это то же самое, что иjava.lang.System.out.println()
- когда вы вызываете стандартный библиотечныйprintln
метод Scala изнутри, он вызывает методprintln
дляPrintStream
экземпляра объекта, который объявлен как полеout
вSystem
классе (или, точнее,outVar
вConsole
объекте), что изменяет его внутреннее состояние. , Это можно рассматривать как еще одно объяснение, почемуprintln
это нечистая функция.Надеюсь это поможет!
источник
Это связано с концепцией ссылочной прозрачности . Выражение является ссылочно прозрачным, если вы можете заменить его оцененным результатом без изменения программы .
Когда выражение не является ссылочно прозрачным, мы говорим, что оно имеет побочные эффекты .
пока
Вы можете найти более подробное объяснение здесь: https://typelevel.org/blog/2017/05/02/io-monad-for-cats.html
источник
f(println("effect"), println("effect"))
собирается печатать два раза в консоли «эффект», в то времяval x = println("effect");f(x,x)
как собирается печатать один раз.