Saya sadar bahwa konsep invarian ada di berbagai paradigma pemrograman. Sebagai contoh, invarian loop relevan dalam pemrograman OO, fungsional dan prosedural.
Namun, satu jenis yang sangat berguna yang ditemukan di OOP adalah invarian data tipe tertentu. Inilah yang saya sebut "invarian berbasis tipe" dalam judul. Sebagai contoh, suatu Fraction
tipe mungkin memiliki a numerator
dan denominator
, dengan invarian bahwa gcd mereka selalu 1 (yaitu fraksi dalam bentuk tereduksi). Saya hanya bisa menjamin ini dengan memiliki semacam enkapsulasi jenis, tidak membiarkan datanya diatur secara bebas. Sebagai imbalannya, saya tidak pernah harus memeriksa apakah itu berkurang, jadi saya dapat menyederhanakan algoritma seperti pemeriksaan kesetaraan.
Di sisi lain, jika saya hanya mendeklarasikan Fraction
tipe tanpa memberikan jaminan ini melalui enkapsulasi, saya tidak dapat dengan aman menulis fungsi apa pun pada tipe ini yang mengasumsikan bahwa fraksi berkurang, karena di masa depan orang lain dapat datang dan menambahkan cara untuk mendapatkan fraksi yang tidak berkurang.
Secara umum, kurangnya invarian semacam ini dapat menyebabkan:
- Algoritma yang lebih kompleks karena prasyarat perlu diperiksa / dipastikan di banyak tempat
- Pelanggaran KERING karena pra-kondisi berulang ini mewakili pengetahuan dasar yang sama (bahwa invarian harus benar)
- Harus menerapkan pra-kondisi melalui kegagalan runtime daripada jaminan waktu kompilasi
Jadi pertanyaan saya adalah apa jawaban pemrograman fungsional untuk jenis invarian ini. Apakah ada cara fungsional-idiomatis untuk mencapai hal yang kurang lebih sama? Atau ada beberapa aspek pemrograman fungsional yang membuat manfaatnya kurang relevan?
PrimeNumber
kelas. Akan terlalu mahal untuk melakukan beberapa pemeriksaan berlebih untuk primality untuk setiap operasi, tetapi ini bukan semacam tes yang dapat dilakukan pada waktu kompilasi. (Banyak operasi yang ingin Anda lakukan pada bilangan prima, katakanlah perkalian, jangan membentuk penutupan , yaitu hasil mungkin tidak dijamin prima. (Posting sebagai komentar karena saya sendiri tidak tahu pemrograman fungsional.)