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 ref
erence. Jadi int
variabel tidak berubah, dan ref int
variabel adalah wadah yang bisa berubah untuk int
s. Pada dasarnya, variabel adalah variabel nyata dalam arti matematika (nilai yang tidak diketahui tetapi tetap) dan ref
s adalah "variabel" dalam arti pemrograman imperatif - sel memori yang dapat ditulis dan dibaca. (Saya suka menyebutnya mereka tugas .)
Saya pikir masalahnya const
adalah 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 const
daripada menyisih. Tetapi ketika Anda lupa const
sesuatu dan kemudian memperbaikinya, Anda akan berakhir dalam situasi "keracunan const" yang disebutkan dalam jawaban @ RobY di mana const
perubahan akan mengalir di seluruh kode. Jika const
itu default, Anda tidak akan menemukan diri Anda berlaku const
surut. Selain itu, harus menambahkan di const
mana-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 const
itu tidak secara langsung tentang kekekalan data; const
mengkodekan 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 stdin
terkoneksi Hello, world!
, pertama kali Anda mencoba mengambil nilai dari simpul pertama, itu akan membaca satu char
dan kembali H
. Setelah itu akan terus kembali H
tanpa panggilan lebih lanjut untuk membaca a char
. Demikian juga, simpul kedua akan membaca char
daristdin
pertama kali Anda mencoba mengambil nilainya, kali ini kembali e
dan 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
const
meskipun aliran berperilaku seperti nilai yang tidak berubah. Sekarang bayangkan ada Stream
antarmuka dengan const
metode, dan semua fungsi Anda harapkan const Streams
. Anda CharStream
tidak dapat mengimplementasikan antarmuka!
( EDIT 2: Rupanya ada kata kunci C ++ yang disebut mutable
yang akan memungkinkan kita untuk berbuat curang dan membuatCharStream
const
. Namun, celah ini menghancurkan const
jaminan - sekarang Anda benar-benar tidak dapat memastikan sesuatu tidak akan bermutasi melalui const
metodenya. 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. const
ness adalah bagian dari tanda tangan suatu fungsi, jadi Anda tidak akan bisa meneruskan nonfungsi const
sebagai argumen ke fungsi yang mengharapkan const
fungsi. Menegakkan secara buta di const
sini akan menyebabkan hilangnya keumuman.
Akhirnya, memanipulasi const
objek tidak menjamin bahwa itu tidak bermutasi beberapa keadaan eksternal (statis atau global) di belakang Anda, jadi const
jaminan 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.