Mir ist bewusst, dass das Konzept der Invarianten über mehrere Programmierparadigmen hinweg existiert. Beispielsweise sind Schleifeninvarianten für die OO-, funktionale und prozedurale Programmierung relevant.
Eine sehr nützliche Art in OOP ist jedoch eine Invariante der Daten eines bestimmten Typs. Dies nenne ich im Titel "typbasierte Invarianten". Zum Beispiel Fraction
könnte ein Typ ein numerator
und haben denominator
, mit der Invariante, dass sein gcd immer 1 ist (dh der Bruch ist in einer reduzierten Form). Ich kann dies nur garantieren, indem ich eine Art Kapselung des Typs habe und seine Daten nicht frei einstellen kann. Im Gegenzug muss ich nie prüfen, ob es reduziert ist, damit ich Algorithmen wie Gleichheitsprüfungen vereinfachen kann.
Wenn ich dagegen einfach einen Fraction
Typ deklariere, ohne diese Garantie durch Kapselung bereitzustellen, kann ich keine Funktionen für diesen Typ sicher schreiben, die davon ausgehen, dass der Bruch reduziert wird, da in Zukunft jemand anderes mitkommen und einen Weg hinzufügen könnte einen nicht reduzierten Bruchteil zu bekommen.
Im Allgemeinen kann das Fehlen dieser Art von Invariante zu Folgendem führen:
- Komplexere Algorithmen als Vorbedingungen müssen an mehreren Stellen überprüft / sichergestellt werden
- DRY-Verstöße, da diese wiederholten Voraussetzungen dasselbe zugrunde liegende Wissen darstellen (dass die Invariante wahr sein sollte)
- Voraussetzungen müssen durch Laufzeitfehler und nicht durch Garantien zur Kompilierungszeit erzwungen werden
Meine Frage ist also, wie die funktionale Programmierantwort auf diese Art von Invariante lautet. Gibt es eine funktional-idiomatische Möglichkeit, mehr oder weniger dasselbe zu erreichen? Oder gibt es einen Aspekt der funktionalen Programmierung, der die Vorteile weniger relevant macht?
PrimeNumber
Klasse. Es wäre zu teuer, für jede Operation mehrere redundante Überprüfungen der Primalität durchzuführen, aber es ist keine Art von Test, der zur Kompilierungszeit durchgeführt werden kann. (Viele Operationen, die Sie mit Primzahlen ausführen möchten, z. B. Multiplikation, bilden keinen Abschluss , dh die Ergebnisse sind wahrscheinlich keine garantierte Primzahl. (Als Kommentar