Sono consapevole che il concetto di invarianti esiste attraverso molteplici paradigmi di programmazione. Ad esempio, gli invarianti di loop sono rilevanti nella programmazione OO, funzionale e procedurale.
Tuttavia, un tipo molto utile trovato in OOP è un invariante dei dati di un tipo particolare. Questo è ciò che chiamo "invarianti di tipo" nel titolo. Ad esempio, un Fraction
tipo potrebbe avere un numerator
e denominator
, con l'invariante che il loro gcd è sempre 1 (cioè la frazione è in forma ridotta). Posso garantirlo solo avendo un qualche tipo di incapsulamento del tipo, non lasciando che i suoi dati siano impostati liberamente. In cambio, non devo mai controllare se è ridotto, quindi posso semplificare algoritmi come i controlli di uguaglianza.
D'altra parte, se dichiaro semplicemente un Fraction
tipo senza fornire questa garanzia attraverso l'incapsulamento, non posso scrivere in modo sicuro alcuna funzione su questo tipo che presupponga che la frazione sia ridotta, perché in futuro qualcun altro potrebbe venire e aggiungere un modo di ottenere una frazione non ridotta.
In generale, la mancanza di questo tipo di invariante potrebbe portare a:
- Algoritmi più complessi come pre-condizioni devono essere controllati / garantiti in più punti
- Violazioni ASCIUTTE poiché queste pre-condizioni ripetute rappresentano la stessa conoscenza di base (che l'invariante dovrebbe essere vero)
- Dover applicare pre-condizioni attraverso errori di runtime piuttosto che garanzie in fase di compilazione
Quindi la mia domanda è quale sia la risposta di programmazione funzionale a questo tipo di invariante. Esiste un modo funzionale-idiomatico per ottenere più o meno la stessa cosa? O c'è qualche aspetto della programmazione funzionale che rende i benefici meno rilevanti?
PrimeNumber
lezione. Sarebbe troppo costoso eseguire più controlli ridondanti per la primalità per ogni operazione, ma non è un tipo di test che può essere eseguito in fase di compilazione. (Molte operazioni che vorresti eseguire sui numeri primi, diciamo la moltiplicazione, non formano una chiusura , cioè i risultati probabilmente non sono garantiti come primi. (Pubblicare come commenti poiché non conosco la programmazione funzionale da solo.)