web-dev-qa-db-ja.com

printlnが不純な関数と見なされるのはなぜですか?

私は本のプログラミングをスカラで読んでいます、そしてそれは言われています:

...この場合、その副作用は標準出力ストリームへの出力です。

そして、私は副作用がどこにあるのかわかりません、同じ入力に対して、printlnは同じ出力を出力するからです(私は思う)
[〜#〜]更新[〜#〜]
たとえば、電話をかけるときはいつでも:

_println(5)
_

5と表示されます。println(5)を呼び出すと5以外の値が表示される場合はありません。

10
aName

この質問にはすでにいい答えが出されていますが、2セント追加します。

println関数の内部を調べる場合、基本的にはJava.lang.System.out.println()と同じです。したがって、Scalaの標準ライブラリprintlnメソッドを内部で呼び出すと、メソッドprintlnPrintStreamクラスのフィールドoutとして宣言されているSystemオブジェクトインスタンス(またはより正確にはoutVarオブジェクトのConsole)、内部状態を変更します。これは、printlnが不純な関数である理由のもう1つの説明と考えることができます。

お役に立てれば!

2
Ivan Kurchenko

参照透過性の概念に関係しています。プログラムを変更せずに評価結果で置換できる場合、式は参照透過的です

式が参照的に透過的でない場合、副作用があると言います。

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

1
Didac Montero