Os sistemas de tipos evitam 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; isso lança uma exceção. Em uma linguagem como Java, C #, Haskell , qualquer que seja, esse 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 tipo melhor exclui mais erros. Se pularmos para sistemas de tipo super avançado, podemos dizer coisas como estas:
Definition divide x (y : {x : integer | x /= 0}) = x / y
Agora, o sistema de tipos garante que não há erros de divisão por 0.
Que tipo de erros
Aqui está uma breve lista de quais tipos de erros os sistemas podem impedir
- Erros fora do intervalo
- injeção SQL
- Generalizando 2, muitos problemas de segurança (para que serve a verificação de contaminação no Perl )
- Erros fora de sequência (esquecendo de chamar init)
- Forçando um subconjunto de valores a ser usado (por exemplo, apenas números 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 requer pureza, o que também exige tipos)
- Generalizando 8, controlando efeitos colaterais
- Invariantes sobre estruturas de dados (uma árvore binária é equilibrada?)
- Esquecendo uma exceção ou lançando a errada
E lembre-se, isso também é em 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 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 digitado cálculo lambda .
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 é possível no cálculo lambda normal porque, bem, não é verdade.
Pense nisso: podemos usar sistemas de tipos para garantir que nosso programa não fique em loop para sempre, é bem legal, certo?
Desvio para tipos dinâmicos
Os sistemas dinâmicos podem oferecer garantias idênticas aos sistemas estáticos, 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. No entanto, você perde algumas garantias, principalmente sobre propriedades estáticas, como rescisão.
Portanto, tipos dinâmicos não descartam determinados programas, mas direcionam programas malformados para ações bem definidas, como lançar exceções.
TLDR
Portanto, o longo e o curto são os sistemas de tipos que excluem certos programas. Muitos dos programas são interrompidos de alguma forma, portanto, com sistemas de tipos, evitamos esses programas interrompidos.