Wiem, że koncepcja niezmienników istnieje w wielu paradygmatach programowania. Na przykład niezmienniki pętli są istotne w OO, programowaniu funkcjonalnym i proceduralnym.
Jednak jednym bardzo przydatnym rodzajem znalezionym w OOP jest niezmiennik danych określonego typu. To właśnie nazywam w tytule „niezmiennikami opartymi na typie”. Na przykład Fraction
typ może mieć numerator
a denominator
, przy niezmienniku, że ich gcd wynosi zawsze 1 (tzn. Ułamek jest w postaci zredukowanej). Mogę to zagwarantować tylko poprzez pewnego rodzaju enkapsulację tego typu, nie pozwalając na swobodne ustawianie danych. W zamian nigdy nie muszę sprawdzać, czy jest zmniejszone, więc mogę uprościć algorytmy, takie jak kontrole równości.
Z drugiej strony, jeśli po prostu zadeklaruję Fraction
typ bez zapewnienia tej gwarancji poprzez enkapsulację, nie mogę bezpiecznie napisać żadnych funkcji tego typu, które zakładają, że ułamek jest zmniejszony, ponieważ w przyszłości ktoś inny mógłby przyjść i dodać sposób zdobycia niezredukowanej frakcji.
Zasadniczo brak tego rodzaju niezmiennika może prowadzić do:
- Bardziej złożone algorytmy, ponieważ warunki wstępne muszą być sprawdzane / zapewniane w wielu miejscach
- Naruszenia OSUSZANIA, ponieważ te powtarzające się warunki wstępne reprezentują tę samą wiedzę podstawową (że niezmiennik powinien być prawdziwy)
- Konieczność egzekwowania warunków wstępnych przez awarie środowiska wykonawczego zamiast gwarancji czasu kompilacji
Moje pytanie brzmi więc, jaka jest funkcjonalna odpowiedź programowa na tego rodzaju niezmiennik. Czy istnieje funkcjonalnie-idiomatyczny sposób osiągnięcia mniej więcej tego samego? Czy jest jakiś aspekt programowania funkcjonalnego, który sprawia, że korzyści są mniej istotne?
PrimeNumber
klasę. Wykonanie wielu redundantnych kontroli pierwszeństwa dla każdej operacji byłoby zbyt drogie, ale nie jest to rodzaj testu, który można wykonać w czasie kompilacji. (Wiele operacji, które chciałbyś wykonać na liczbach pierwszych, powiedzmy, mnożenie, nie tworzy zamknięcia , tzn. Wyniki prawdopodobnie nie są gwarantowane jako liczby pierwsze. (Publikowanie jako komentarz, ponieważ sam nie znam programowania funkcjonalnego.)