Soy consciente de que el concepto de invariantes existe en múltiples paradigmas de programación. Por ejemplo, los invariantes de bucle son relevantes en la programación OO, funcional y de procedimiento.
Sin embargo, un tipo muy útil que se encuentra en OOP es una invariante de los datos de un tipo particular. Esto es lo que llamo "invariantes basados en tipos" en el título. Por ejemplo, un Fraction
tipo podría tener un numerator
y denominator
, con la invariante de que su mcd siempre es 1 (es decir, la fracción está en una forma reducida). Solo puedo garantizar esto al tener algún tipo de encapsulación del tipo, sin dejar que sus datos se configuren libremente. A cambio, nunca tengo que verificar si se reduce, por lo que puedo simplificar algoritmos como las verificaciones de igualdad.
Por otro lado, si simplemente declaro un Fraction
tipo sin proporcionar esta garantía a través de la encapsulación, no puedo escribir con seguridad ninguna función en este tipo que suponga que la fracción se reduce, porque en el futuro alguien más podría venir y agregar una forma de conseguir una fracción no reducida.
En general, la falta de este tipo de invariante podría conducir a:
- Los algoritmos más complejos como condiciones previas deben verificarse / garantizarse en múltiples lugares
- Violaciones SECAS ya que estas precondiciones repetidas representan el mismo conocimiento subyacente (que la invariante debe ser verdadera)
- Tener que imponer condiciones previas a través de fallas de tiempo de ejecución en lugar de garantías en tiempo de compilación
Entonces mi pregunta es cuál es la respuesta de programación funcional a este tipo de invariante. ¿Existe una forma funcional-idiomática de lograr más o menos lo mismo? ¿O hay algún aspecto de la programación funcional que hace que los beneficios sean menos relevantes?
PrimeNumber
clase. Sería demasiado costoso realizar múltiples verificaciones redundantes de primalidad para cada operación, pero no es un tipo de prueba que pueda realizarse en tiempo de compilación. (Una gran cantidad de operaciones que desea realizar en números primos, por ejemplo multiplicación, no forman un cierre , es decir, los resultados probablemente no son garantizados primo (envíos como los comentarios ya que no conozco a mí mismo la programación funcional)..