私は本のプログラミングをスカラで読んでいます、そしてそれは言われています:
...この場合、その副作用は標準出力ストリームへの出力です。
そして、私は副作用がどこにあるのかわかりません、同じ入力に対して、printlnは同じ出力を出力するからです(私は思う)
[〜#〜]更新[〜#〜]
たとえば、電話をかけるときはいつでも:
_println(5)
_
5と表示されます。println(5)
を呼び出すと5以外の値が表示される場合はありません。
この質問にはすでにいい答えが出されていますが、2セント追加します。
println
関数の内部を調べる場合、基本的にはJava.lang.System.out.println()
と同じです。したがって、Scalaの標準ライブラリprintln
メソッドを内部で呼び出すと、メソッドprintln
PrintStream
クラスのフィールドout
として宣言されているSystem
オブジェクトインスタンス(またはより正確にはoutVar
オブジェクトのConsole
)、内部状態を変更します。これは、println
が不純な関数である理由のもう1つの説明と考えることができます。
お役に立てれば!
参照透過性の概念に関係しています。プログラムを変更せずに評価結果で置換できる場合、式は参照透過的です。
式が参照的に透過的でない場合、副作用があると言います。
f(println("effect"), println("effect"))
// isn't really equivalent to!
val x = println("effect")
f(x, x)
ながら
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)
詳細な説明はここにあります: https://typelevel.org/blog/2017/05/02/io-monad-for-cats.html