Sistemas de tipos impedem erros
Os sistemas de tipos eliminam programas ilegais. Considere o seguinte código Python.
a = 'foo'
b = True
c = a / b
No Python, este programa falha; lança uma exceção. Em uma linguagem como Java, C #, Haskell , o que quer que seja, isso nem é um programa legal. Você evita completamente esses erros porque eles simplesmente não são possíveis no conjunto de programas de entrada.
Da mesma forma, um sistema de tipos melhor exclui mais erros. Se saltarmos para sistemas de tipos super avançados, podemos dizer coisas como esta:
Definition divide x (y : {x : integer | x /= 0}) = x / y
Agora, o sistema de tipos garante que não haja erros de divisão por zero.
Que tipo de erros
Veja uma breve lista de quais tipos de erros os sistemas podem impedir
- Erros fora do intervalo
- Injeção de SQL
- Generalizando 2, muitos problemas de segurança (o que teste de retenção é para Perl )
- Erros fora de sequência (esquecendo de chamar o init)
- Forçando um subconjunto de valores a serem usados (por exemplo, somente inteiros maiores que 0)
-
Gatinhos nefastos(Sim, foi uma piada) - Erros de perda de precisão
- Erros de memória transacional de software (STM) (isso precisa de pureza, o que também requer tipos)
- Generalizando 8, controlando os efeitos colaterais
- Invariantes sobre estruturas de dados (é uma árvore binária balanceada?)
- Esquecendo uma exceção ou jogando a errada
E lembre-se, isso também ocorre no tempo de compilação . Não há necessidade de escrever testes com 100% de cobertura de código para simplesmente verificar erros de tipo, o compilador apenas faz isso por você:)
Estudo de caso: cálculo lambda digitado
Tudo bem, vamos examinar o mais simples de todos os sistemas de tipos, simplesmente cálculo lambda digitado .
Basicamente, existem dois tipos,
Type = Unit | Type -> Type
E todos os termos são variáveis, lambdas ou aplicativo. Com base nisso, podemos provar que qualquer programa bem digitado termina. Nunca há uma situação em que o programa fique preso ou faça um loop para sempre. Isso não é provavel no cálculo lambda normal porque, bem, não é verdade.
Pense nisso, podemos usar sistemas de tipos para garantir que o nosso programa não faça um loop para sempre, muito legal, certo?
Desvio para tipos dinâmicos
Sistemas de tipo dinâmico podem oferecer garantias idênticas como sistemas de tipo estático, mas em tempo de execução, em vez de tempo de compilação. Na verdade, como é tempo de execução, você pode oferecer mais informações. Você perde algumas garantias, no entanto, particularmente sobre propriedades estáticas como rescisão.
Assim, os tipos dinâmicos não excluem determinados programas, mas direcionam os programas malformados para ações bem definidas, como gerar exceções.
TLDR
Portanto, o longo e o curto, é que os sistemas de tipos excluem certos programas. Muitos dos programas são quebrados de alguma forma, portanto, com sistemas de tipos, evitamos esses programas quebrados.