Catatan yakin jika ini memenuhi syarat untuk Anda, tetapi dalam bahasa fungsional seperti Standar ML semuanya tidak dapat diubah secara default. Mutasi didukung melalui tipe generik reference. Jadi intvariabel tidak berubah, dan ref intvariabel adalah wadah yang bisa berubah untuk ints. Pada dasarnya, variabel adalah variabel nyata dalam arti matematika (nilai yang tidak diketahui tetapi tetap) dan refs adalah "variabel" dalam arti pemrograman imperatif - sel memori yang dapat ditulis dan dibaca. (Saya suka menyebutnya mereka tugas .)
Saya pikir masalahnya constadalah dua kali lipat. Pertama, C ++ tidak memiliki pengumpulan sampah, yang diperlukan untuk memiliki struktur data persisten non-sepele . const harus mendalam untuk masuk akal, namun memiliki nilai yang sepenuhnya tidak dapat diubah dalam C ++ tidak praktis.
Kedua, di C ++ Anda harus memilih untuk ikut serta constdaripada menyisih. Tetapi ketika Anda lupa constsesuatu dan kemudian memperbaikinya, Anda akan berakhir dalam situasi "keracunan const" yang disebutkan dalam jawaban @ RobY di mana constperubahan akan mengalir di seluruh kode. Jika constitu default, Anda tidak akan menemukan diri Anda berlaku constsurut. Selain itu, harus menambahkan di constmana-mana menambahkan banyak suara ke kode.
Saya menduga bahasa umum yang mengikuti (misalnya Jawa) sangat dibentuk oleh keberhasilan dan cara berpikir C dan C ++. Contoh kasus, bahkan dengan pengumpulan sampah, sebagian besar API pengumpulan bahasa mengasumsikan struktur data yang bisa berubah. Fakta bahwa semuanya bisa berubah dan ketidakmampuan dilihat sebagai kasus sudut berbicara banyak tentang pola pikir imperatif di balik bahasa populer.
EDIT : Setelah merenungkan komentar greenoldman, saya menyadari bahwa constitu tidak secara langsung tentang kekekalan data; constmengkodekan ke dalam jenis metode apakah itu memiliki efek samping pada instance.
Dimungkinkan untuk menggunakan mutasi untuk mencapai perilaku yang transparan secara referensial . Misalkan Anda memiliki fungsi yang ketika dipanggil berturut-turut mengembalikan nilai yang berbeda - misalnya, fungsi yang membaca satu karakter dari stdin. Kita dapat menggunakan cache / memoize hasil dari fungsi ini untuk menghasilkan aliran nilai yang secara referensi transparan. Aliran akan menjadi daftar yang ditautkan yang simpulnya akan memanggil fungsi saat pertama kali Anda mencoba mengambil nilainya, tetapi kemudian menyimpan hasilnya. Jadi jika stdinterkoneksi Hello, world!, pertama kali Anda mencoba mengambil nilai dari simpul pertama, itu akan membaca satu chardan kembali H. Setelah itu akan terus kembali Htanpa panggilan lebih lanjut untuk membaca a char. Demikian juga, simpul kedua akan membaca chardaristdinpertama kali Anda mencoba mengambil nilainya, kali ini kembali edan menyimpan hasilnya.
Hal yang menarik di sini adalah bahwa Anda telah mengubah proses yang secara inheren stateful menjadi objek yang tampaknya tanpa kewarganegaraan. Namun, perlu untuk memutasikan keadaan internal objek (dengan menyimpan hasil) untuk mencapai ini - mutasi adalah efek jinak . Tidak mungkin membuat kami CharStream constmeskipun aliran berperilaku seperti nilai yang tidak berubah. Sekarang bayangkan ada Streamantarmuka dengan constmetode, dan semua fungsi Anda harapkan const Streams. Anda CharStreamtidak dapat mengimplementasikan antarmuka!
( EDIT 2: Rupanya ada kata kunci C ++ yang disebut mutableyang akan memungkinkan kita untuk berbuat curang dan membuatCharStream const . Namun, celah ini menghancurkan constjaminan - sekarang Anda benar-benar tidak dapat memastikan sesuatu tidak akan bermutasi melalui constmetodenya. Saya kira itu bukan itu buruk karena Anda harus secara eksplisit meminta celah, tetapi Anda masih sepenuhnya bergantung pada sistem kehormatan.)
Kedua, anggaplah Anda memiliki fungsi tingkat tinggi - yaitu, Anda bisa meneruskan fungsi sebagai argumen ke fungsi lain. constness adalah bagian dari tanda tangan suatu fungsi, jadi Anda tidak akan bisa meneruskan nonfungsi constsebagai argumen ke fungsi yang mengharapkan constfungsi. Menegakkan secara buta di constsini akan menyebabkan hilangnya keumuman.
Akhirnya, memanipulasi constobjek tidak menjamin bahwa itu tidak bermutasi beberapa keadaan eksternal (statis atau global) di belakang Anda, jadi constjaminan tidak sekuat yang awalnya muncul.
Tidak jelas bagi saya bahwa pengkodean ada atau tidaknya efek samping ke dalam sistem tipe secara universal adalah hal yang baik.