Apa sebenarnya yang menjadikan pembacaan dari memori proses operasi murni? Misalkan saya membuat array 100 integer dalam memori global dan kemudian mengambil elemen ke-42 dari array ini. Itu bukan efek samping, kan? Jadi mengapa membaca array yang sama dari 100 bilangan bulat dari file efek samping?
functional-programming
side-effect
ZhekaKozlov
sumber
sumber
Jawaban:
Jika memori yang Anda akses dapat berubah, maka itu memang efek samping.
Misalnya, di Haskell, fungsi untuk mengakses array yang dapat diubah (
IOArray
) memiliki tipe(sedikit disederhanakan untuk tujuan kita). Saat mengakses array yang tidak dapat diubah memiliki tipe
Versi pertama mengembalikan sesuatu bertipe
IO e
yang artinya memiliki efek samping I / O. Versi kedua hanya mengembalikan elemen tipee
tanpa efek samping.Dalam hal mengakses file, Anda tidak bisa tahu pada waktu kompilasi apakah file akan pernah berubah selama menjalankan program. Karena itu, Anda harus selalu memperlakukannya sebagai operasi dengan potensi efek samping.
sumber
Dalam ilmu komputer, fungsi atau ekspresi dikatakan memiliki efek samping jika, selain mengembalikan nilai, itu juga memodifikasi beberapa keadaan atau memiliki interaksi yang dapat diamati dengan fungsi panggilan atau dunia luar. Membaca dari file adalah interaksi yang dapat diamati dengan dunia luar. Memenuhi definisi efek samping. Membaca elemen ke-42 dari memori global akan menjadi efek samping juga kecuali jika array Anda adalah konstan karena itu akan menjadi interaksi yang dapat diamati dengan fungsi lain yang dapat memodifikasi array.
sumber
Jika Anda memiliki pegangan file bersama maka membaca file akan memindahkan pegangan file itu ke posisi di mana Anda telah membaca, dan akan meninggalkannya di posisi itu.
Jika Anda memiliki dua utas dengan pegangan file yang terpisah ke file yang sama, membaca dari satu tidak akan memiliki efek samping yang terlihat pada yang lain.
Namun dalam kedua kasus ini, pembacaan memori dan pembacaan file, mungkin ada efek samping tersembunyi dari caching sistem operator.
sumber
Membaca dari memori tidak memengaruhi fungsi lain dan karenanya bebas efek samping. Membaca dari file biasanya akan memindahkan penunjuk posisi file, sehingga ketika Anda membaca lagi Anda membaca data setelah apa yang sudah Anda baca, jadi satu fungsi baca mengubah hasil dari fungsi baca lainnya, yang merupakan efek samping. Jika Anda membuka, membaca, dan menutup file sekaligus, efek samping ini menghilang, tetapi itu tidak layak untuk file besar. Selain itu, tergantung pada bagaimana Anda membuka file, mungkin menjadi terkunci setelah membukanya, jadi yang pertama mencoba untuk membuka dan membaca file berhasil sementara mencoba berikut akan gagal dengan kesalahan File Sudah Buka , yang lagi-lagi merupakan efek samping.
Membuat fungsi membaca bebas efek samping yang membaca file dalam sekali jalan dan memungkinkan banyak membaca sekaligus sulit karena ada fungsi penulisan file yang dipengaruhi oleh fungsi membaca dan menyingkirkan fungsi penulisan file lagi-lagi tidak layak. .
sumber
IO
monad?) Anda dapat membuat fungsi bebas efek samping untuk membaca.Membaca dari aliran adalah efek samping karena hasil dari fungsi seperti
isEOF
dapat mengembalikan hasil yang berbeda setelah membaca daripada sebelum membaca.sumber