Salah satu prinsip Pemrograman Fungsional adalah penggunaan Fungsi Murni. Fungsi Murni adalah fungsi yang bebas efek samping dan transparan referensial.
Getters tidak transparan secara referensi - jika seorang Setter dipanggil di antara panggilan ke Getter, nilai pengembalian Getter berubah meskipun parameternya tidak (biasanya tidak ada parameter)
Setter menghasilkan efek samping - Memanggil Setter sebuah biasanya memanipulasi nilai yang tidak nilai kembali (pada kenyataannya, secara tradisional setter kembali apa-apa)
Saya tahu di Scala kita hanya menerima kenyataan bahwa kita menyatukan dua paradigma (fungsional dan berorientasi objek) dan menggunakan getter / setter seperti yang kita lakukan dalam bahasa seperti Java.
Dalam bahasa seperti Haskell (yang saya tidak fasih, tapi saya diberitahu memegang lebih benar untuk bahasa fungsional "Murni") Saya hanya ingin tahu, bagaimana Anda akan memodelkan properti pada objek sedemikian sehingga Getters secara referensial transparan dan Setter apakah efek sampingnya gratis?
Apakah solusinya dengan mengembalikan salinan objek yang ditetapkan oleh setter sebagai nilai pengembalian setter, dan salinan ini berisi perubahan ke nilai properti?
sumber
Jawaban:
Persis. Lihat metode kelas kasus
copy
, atau konsep umum lensa.Secara khusus, jika keadaan perlu diubah, Anda akan menggunakan monad negara. Perubahan pada state monad dapat dilakukan melalui lensa, yang membuat penggalian informasi dari "state" dan mengubahnya menjadi mudah.
Lihat juga pertanyaan ini tentang masalah umum yang berasal dari struktur yang dalam seperti "keadaan" dan membuat perubahan padanya. Jawabannya memiliki tautan yang baik pada lensa dan resleting jika Anda ingin mengetahui lebih dalam.
sumber
Nah, di Haskell, objek (biasanya) tidak berubah, jadi getter (yang Anda dapatkan ketika Anda menggunakan sintaks rekaman) atau fungsi yang bertindak seperti getter secara transparan transparan. Dan kemudian Anda tidak "mengatur" nilai pada objek - jika Anda membuat objek baru yang mirip dengan yang lama, tetapi dengan nilai yang berbeda untuk salah satu bidang. Ini juga merupakan fungsi murni.
sumber
"Getters dan setter memiliki objek sebagai parameter - meskipun biasanya implisit - sehingga getter secara referensi transparan. - delnan"
Transparan secara referensial berarti bahwa fungsi SELALU mengembalikan output yang sama untuk input yang sama; jadi jika atribut objek telah diubah oleh setter, Anda tidak mengembalikan output yang sama. :)
sumber