Saya ingin memahami pada level rendah apa yang akan terjadi jika struktur data tidak persisten?
Mari kita lihat generator nomor pseudorandom dengan ruang keadaan besar (seperti " Mersenne twister " dengan status 2450 byte) sebagai struktur data. Kami tidak benar-benar ingin menggunakan angka acak lebih dari sekali, jadi sepertinya ada sedikit alasan untuk menerapkan ini sebagai struktur data persisten yang tidak dapat diubah. Sekarang mari kita bertanya pada diri sendiri apa yang mungkin salah dalam kode berikut:
mt_gen = CreateMersenneTwisterPRNGen(seed)
integral = MonteCarloIntegral_Bulk(mt_gen) + MonteCarloIntegral_Boundary(mt_gen)
Sebagian besar bahasa pemrograman tidak menentukan urutan MonteCarloIntegral_Bulk
dan MonteCarloIntegral_Boundary
akan dievaluasi. Jika keduanya mengambil referensi ke mt_gen yang bisa berubah sebagai argumen, hasil perhitungan ini bisa bergantung pada platform. Lebih buruk lagi, mungkin ada platform di mana hasilnya tidak dapat direproduksi sama sekali di antara berbagai proses.
Seseorang dapat mendesain struktur data yang dapat diubah yang efisien untuk mt_gen sedemikian rupa sehingga setiap interleaving dari eksekusi MonteCarloIntegral_Bulk
dan MonteCarloIntegral_Boundary
akan memberikan hasil yang "benar", tetapi interleaving yang berbeda pada umumnya akan mengarah pada hasil "benar" yang berbeda. Non-reproduktifitas ini membuat fungsi yang sesuai "tidak murni", dan juga menyebabkan beberapa masalah lainnya.
Non-reproduktifitas dapat dihindari dengan menegakkan urutan eksekusi berurutan tetap. Tetapi dalam hal ini kode dapat diatur sedemikian rupa sehingga hanya satu referensi ke mt_gen tersedia pada waktu tertentu. Dalam bahasa pemrograman fungsional yang diketik, tipe keunikan dapat digunakan untuk menegakkan batasan ini, sehingga memungkinkan pembaruan yang dapat diubah juga dalam konteks bahasa pemrograman fungsional murni. Semua ini mungkin terdengar bagus dan keren, tetapi setidaknya dalam teori simulasi Monte Carlo secara paralel memalukan, dan "solusi" kami baru saja menghancurkan properti ini. Ini bukan hanya masalah teoretis, tetapi masalah praktis yang sangat nyata. Namun, kita harus memodifikasi (fungsi yang ditawarkan oleh) generator nomor pseudorandom kita dan urutan nomor acak yang dihasilkannya, dan tidak ada bahasa pemrograman yang dapat melakukan ini secara otomatis untuk kita. (Tentu saja kita dapat menggunakan pustaka nomor acak pseudorandom berbeda yang sudah menawarkan fungsionalitas yang diperlukan.)
Pada tingkat rendah, struktur data yang dapat berubah dengan mudah menyebabkan tidak dapat direproduksi (dan karenanya tidak murni), jika urutan eksekusi tidak berurutan dan diperbaiki. Strategi imperatif khas untuk menangani masalah ini adalah memiliki fase berurutan dengan urutan eksekusi tetap, di mana struktur data yang bisa berubah berubah, dan fase paralel dengan urutan eksekusi sewenang-wenang, di mana semua struktur data yang dapat dibagikan bersama tetap konstan.
Andrej Bauer mengangkat masalah aliasing untuk struktur data yang bisa berubah. Yang cukup menarik, bahasa imperatif yang berbeda seperti Fortran dan C memiliki asumsi yang berbeda tentang aliasing argumen fungsi yang dibolehkan, dan sebagian besar programmer cukup tidak menyadari bahwa bahasa mereka memiliki model aliasing sama sekali.
Semantik ketidakmampuan dan nilai mungkin sedikit berlebihan. Yang lebih penting adalah bahwa sistem tipe dan kerangka kerja logis (seperti model mesin abstrak, model aliasing, model konkurensi, atau model manajemen memori) bahasa pemrograman Anda menawarkan dukungan yang cukup untuk bekerja "secara aman" dengan data "efisien" struktur. Pengenalan "pindahkan semantik" ke C ++ 11 mungkin terlihat seperti langkah mundur besar dalam hal kemurnian dan "keamanan" dari sudut pandang teoretis, tetapi dalam praktiknya kebalikannya. Sistem tipe dan kerangka logis bahasa telah diperluas untuk menghilangkan bagian besar dari bahaya yang terkait dengan semantik baru. (Dan bahkan jika tepi kasar tetap ada, ini tidak berarti bahwa ini tidak dapat diperbaiki dengan "lebih baik"
Uday Reddy mengangkat masalah bahwa matematika tidak pernah bekerja dengan objek data yang dapat berubah, dan bahwa sistem tipe untuk program fungsional dikembangkan dengan baik untuk objek data yang tidak dapat diubah. Ini mengingatkan saya pada penjelasan Jean-Yves Girard bahwa matematika tidak digunakan untuk bekerja dengan benda-benda yang berubah, ketika dia mencoba untuk memotivasi logika linier.
Orang mungkin bertanya bagaimana memperluas sistem tipe dan kerangka kerja logis dari bahasa pemrograman fungsional untuk memungkinkan bekerja "dengan aman" dengan struktur data non-persisten yang "bisa diubah" yang bisa berubah. Satu masalah di sini mungkin logika klasik dan aljabar boolean mungkin bukan kerangka kerja logis terbaik untuk bekerja dengan struktur data yang bisa berubah. Mungkin logika linier dan monoid komutatif mungkin lebih cocok untuk tugas itu? Mungkin saya harus membaca apa yang dikatakan Philip Wadler tentang logika linier sebagai sistem tipe untuk bahasa pemrograman fungsional? Tetapi bahkan jika logika linier seharusnya tidak dapat menyelesaikan masalah ini, ini tidak berarti bahwa sistem tipe dan kerangka kerja logis dari bahasa pemrograman fungsional tidak dapat diperluas untuk memungkinkan "aman" dan "efisien"