Maaf untuk pertanyaan efek samping FP + lainnya, tetapi saya tidak dapat menemukan yang sudah ada yang menjawab ini untuk saya.
Pemahaman saya (terbatas) tentang pemrograman fungsional adalah bahwa keadaan / efek samping harus diminimalkan dan dipisahkan dari logika stateless.
Saya juga mengumpulkan pendekatan Haskell untuk ini, monad IO, mencapai ini dengan membungkus tindakan negara dalam sebuah wadah, untuk kemudian dieksekusi, dianggap di luar lingkup program itu sendiri.
Saya mencoba memahami pola ini, tetapi sebenarnya untuk menentukan apakah akan menggunakannya dalam proyek Python, jadi ingin menghindari spesifik Haskell jika poss.
Contoh kasar masuk.
Jika program saya mengonversi file XML ke file JSON:
def main():
xml_data = read_file('input.xml') # impure
json_data = convert(xml_data) # pure
write_file('output.json', json_data) # impure
Bukankah pendekatan IO monad efektif untuk melakukan ini:
steps = list(
read_file,
convert,
write_file,
)
kemudian membebaskan diri dari tanggung jawab dengan tidak benar-benar memanggil langkah-langkah itu, tetapi membiarkan penerjemah melakukannya?
Atau dengan kata lain, itu seperti menulis:
def main(): # pure
def inner(): # impure
xml_data = read_file('input.xml')
json_data = convert(xml_data)
write_file('output.json', json_data)
return inner
kemudian mengharapkan orang lain untuk menelepon inner()
dan mengatakan pekerjaan Anda selesai karena main()
itu murni.
Seluruh program pada akhirnya akan terkandung dalam monad IO, pada dasarnya.
Ketika kode benar-benar dieksekusi , semuanya setelah membaca file tergantung pada status file itu sehingga masih akan menderita bug terkait negara yang sama dengan implementasi imperatif, jadi apakah Anda benar-benar mendapatkan sesuatu, sebagai programmer yang akan mempertahankan ini?
Saya benar-benar menghargai manfaat mengurangi dan mengisolasi perilaku negara, yang sebenarnya mengapa saya menyusun versi imperatif seperti itu: mengumpulkan input, melakukan hal-hal murni, mengeluarkan output. Semoga convert()
bisa benar-benar murni dan menuai manfaat cachability, threadsafety, dll.
Saya juga menghargai bahwa jenis monadik dapat bermanfaat, terutama dalam jaringan pipa yang beroperasi pada jenis yang sebanding, tetapi tidak melihat mengapa IO harus menggunakan monad kecuali sudah ada dalam pipa seperti itu.
Apakah ada manfaat tambahan untuk berurusan dengan efek samping yang dibawa oleh pola IO monad, yang saya lewatkan?
main
dalam program Haskell adalah IO ()
- tindakan IO. Ini sebenarnya bukan fungsi sama sekali; itu sebuah nilai . Seluruh program Anda adalah nilai murni yang berisi instruksi yang memberi tahu runtime bahasa apa yang harus dilakukan. Semua hal yang tidak murni (benar-benar melakukan tindakan IO) berada di luar cakupan program Anda.
read_file
) dan menggunakannya sebagai argumen ke yang berikutnya ( write_file
). Jika Anda hanya memiliki urutan tindakan independen, Anda tidak perlu Monad.