Estou ciente de que o conceito de invariantes existe em vários paradigmas de programação. Por exemplo, invariantes de loop são relevantes em OO, programação funcional e processual.
No entanto, um tipo muito útil encontrado no OOP é um invariante dos dados de um tipo específico. É isso que estou chamando de "invariantes baseados em tipo" no título. Por exemplo, um Fraction
tipo pode ter um numerator
e denominator
, com o invariante que a sua gcd é sempre 1 (isto é, a fracção está numa forma reduzida). Só posso garantir isso tendo algum tipo de encapsulamento do tipo, não permitindo que seus dados sejam configurados livremente. Em troca, nunca tenho que verificar se é reduzido, para simplificar algoritmos como verificações de igualdade.
Por outro lado, se eu simplesmente declarar um Fraction
tipo sem fornecer essa garantia por meio do encapsulamento, não posso escrever com segurança nenhuma função nesse tipo que assuma que a fração seja reduzida, porque no futuro alguém mais poderia aparecer e adicionar uma maneira de se apossar de uma fração não reduzida.
Geralmente, a falta desse tipo de invariante pode levar a:
- Algoritmos mais complexos, pois as pré-condições precisam ser verificadas / garantidas em vários locais
- Violações DRY, pois essas pré-condições repetidas representam o mesmo conhecimento subjacente (que o invariante deve ser verdadeiro)
- Ter que impor condições prévias através de falhas de tempo de execução, em vez de garantias em tempo de compilação
Então, minha pergunta é qual é a resposta da programação funcional para esse tipo de invariante. Existe uma maneira idiomática funcional de conseguir mais ou menos a mesma coisa? Ou há algum aspecto da programação funcional que torna os benefícios menos relevantes?
PrimeNumber
aula. Seria muito caro executar várias verificações redundantes de primalidade para cada operação, mas não é um tipo de teste que pode ser executado em tempo de compilação. (A série de operações que você gostaria de realizar em números primos, digamos, multiplicação, não formam um fechamento , ou seja, os resultados provavelmente não são garantidos prime (Posting como comentários, uma vez que não conheço programação funcional eu)..