Saya membaca pemrograman buku dalam scala, dan dikatakan:
... dalam hal ini, efek sampingnya adalah mencetak ke aliran keluaran standar.
dan saya tidak melihat di mana efek sampingnya, karena, untuk input yang sama, println akan mencetak output yang sama (saya pikir)
PEMBARUAN
misalnya setiap kali kita memanggil:
println(5)
itu akan mencetak 5 , saya tidak melihat kasus di mana panggilan println(5)
akan mencetak nilai selain 5 !!
scala
functional-programming
pure-function
sebuah nama
sumber
sumber
println
adalah fungsi deterministik tetapi untuk menjadi murni juga harus RT.Jawaban:
Anda dapat mengetahui apakah suatu ekspresi memiliki efek samping dengan mengganti ekspresi dengan hasilnya. Jika program berubah arti , ada efek samping. Sebagai contoh,
adalah program yang berbeda dengan
Artinya, efek samping adalah setiap efek yang dapat diamati yang tidak dikodekan dalam hasil mengevaluasi suatu ekspresi. Di sini hasilnya
()
, tetapi tidak ada dalam nilai yang mengkodekan fakta bahwa 5 sekarang telah muncul di suatu tempat di layar Anda.sumber
val a = println("hello"); val b = (a, a)
harus sama denganval b = (pritnln("hello"), println("hello"))
.println(5)
dan()
. Atau maksud Anda kalimat terakhir?x = 1
danx = 1; x = 1; x = 1
?Perhatikan analogi berikut ini
Ini
myprintln
tidak murni karena selain mengembalikan nilai()
, variabel ini juga bermutasiout
sebagai variabel non-lokal sebagai efek samping. Sekarang bayangkanout
vanillaprintln
bermutasi.sumber
()
ia juga mengubah status non-lokal diSystem.out
.Efek sampingnya ada pada kondisi komputer. Setiap kali Anda memanggil
println()
status memori berubah untuk menampilkan nilai yang diberikan ke terminal. Atau lebih umum, keadaan aliran output standar diubah.sumber
Jawaban yang bagus sudah diberikan untuk pertanyaan ini, tetapi izinkan saya menambahkan dua sen saya.
Jika Anda akan melihat ke dalam
println
fungsi dasarnya itu sama denganjava.lang.System.out.println()
- jadi ketika Anda memanggilprintln
metode perpustakaan standar Scala di bawah tenda itu memanggil metodeprintln
padaPrintStream
contoh objek yang dinyatakan sebagai bidangout
diSystem
kelas (atau lebih tepatnyaoutVar
diConsole
objek), yang mengubahnya keadaan internal . Ini dapat dianggap sebagai penjelasan satu lagi mengapaprintln
fungsi tidak murni.Semoga ini membantu!
sumber
Ini ada hubungannya dengan konsep transparansi referensial . Ekspresi transparan referensial jika Anda bisa menggantinya dengan hasil yang dievaluasi tanpa mengubah program .
Ketika sebuah ekspresi tidak transparan secara referensial kita mengatakan bahwa itu memiliki efek samping .
sementara
Anda dapat menemukan penjelasan lebih rinci di sini: https://typelevel.org/blog/2017/05/02/io-monad-for-cats.html
sumber
f(println("effect"), println("effect"))
akan mencetak dua kali di konsol "efek" saatval x = println("effect");f(x,x)
akan mencetak sekali.