Мені відомо, що концепція інваріантів існує в декількох парадигмах програмування. Наприклад, циклічні інваріанти є актуальними в ОО, функціональному та процедурному програмуванні.
Однак один дуже корисний вид, знайдений в ООП, є інваріантом даних певного типу. Це те, що я називаю "типовими інваріантами" у назві. Наприклад, Fraction
тип може мати numerator
а denominator
, з інваріантом, що їх gcd завжди дорівнює 1 (тобто частка знаходиться у зменшеному вигляді). Я можу гарантувати це лише завдяки певному інкапсуляції типу, не дозволяючи його даних встановлювати вільно. Натомість мені ніколи не доводиться перевіряти, чи знижується вона, тому я можу спростити алгоритми, як перевірки рівності.
З іншого боку, якщо я просто декларую Fraction
тип, не надаючи гарантії шляхом інкапсуляції, я не можу сміливо писати жодних функцій цього типу, які припускають, що частка зменшується, тому що в майбутньому хтось інший міг би підійти і додати шлях одержання частки, що не зменшується.
Як правило, відсутність такого роду інваріантів може призвести до:
- Більш складні алгоритми, оскільки попередні умови потрібно перевірити / забезпечити у кількох місцях
- Порушення сухих ситуацій, оскільки ці неодноразові попередні умови являють собою ті самі основні знання (що інваріант повинен бути правдою)
- Необхідність виконувати попередні умови за допомогою відмов роботи, а не гарантій компіляції
Отже, моє запитання полягає в тому, що відповідь функціонального програмування на цей вид інваріанта. Чи існує функціонально-ідіоматичний спосіб досягти більш-менш того самого? Або є якийсь аспект функціонального програмування, який робить переваги менш актуальними?
PrimeNumber
клас. Виконати кілька зайвих перевірок первинності для кожної операції було б занадто дорого, але це не такий тест, який можна виконати під час компіляції. (Дуже багато операцій, які ви хотіли б виконати на простих числах, скажімо, множення, не утворюють закриття , тобто результати, ймовірно, не гарантовані простим. (Публікація як коментарі, оскільки я сам не знаю функціонального програмування.)