Я знаю, что концепция инвариантов существует в нескольких парадигмах программирования. Например, инварианты цикла актуальны в ОО, функциональном и процедурном программировании.
Однако, один очень полезный вид, найденный в ООП, является инвариантом данных определенного типа. Это то, что я называю «инвариантами на основе типов» в заголовке. Например, Fraction
тип может иметь numerator
и denominator
с инвариантом, что их gcd всегда равен 1 (т.е. дробь находится в сокращенной форме). Я могу гарантировать это только наличием некоторой инкапсуляции типа, не позволяющей свободно устанавливать его данные. В свою очередь, мне никогда не нужно проверять, уменьшено ли оно, поэтому я могу упростить алгоритмы, такие как проверки на равенство.
С другой стороны, если я просто объявлю Fraction
тип без предоставления этой гарантии посредством инкапсуляции, я не смогу безопасно написать какие-либо функции для этого типа, которые предполагают, что дробь уменьшена, потому что в будущем кто-то еще может прийти и добавить способ получить неуменьшенную фракцию.
Как правило, отсутствие этого вида инварианта может привести к:
- Более сложные алгоритмы как предварительные условия должны быть проверены / обеспечены в нескольких местах
- СУХОЕ нарушение, поскольку эти повторяющиеся предварительные условия представляют одно и то же базовое знание (что инвариант должен быть верным)
- Необходимость принудительного выполнения предварительных условий из-за сбоев во время выполнения, а не гарантий во время компиляции
Так что мой вопрос в том, что ответ функционального программирования на этот вид инварианта. Существует ли функционально-идиоматический способ достижения более или менее одного и того же? Или есть какой-то аспект функционального программирования, который делает преимущества менее значимыми?
PrimeNumber
класс. Было бы слишком дорого выполнять несколько избыточных проверок на простоту для каждой операции, но это не тот тип теста, который можно выполнить во время компиляции. (Многие операции, которые вы хотели бы выполнить с простыми числами, скажем, умножение, не образуют замыкание , т.е. результаты, вероятно, не гарантируются простыми числами . (Публикация в виде комментариев, поскольку я сам не знаю функционального программирования.)