Los sistemas de tipos evitan errores
Los sistemas de tipos eliminan los programas ilegales. Considere el siguiente código de Python.
a = 'foo'
b = True
c = a / b
En Python, este programa falla; Lanza una excepción. En un lenguaje como Java, C #, Haskell , lo que sea, ni siquiera es un programa legal. Evita por completo estos errores porque simplemente no son posibles en el conjunto de programas de entrada.
Del mismo modo, un mejor sistema de tipos descarta más errores. Si saltamos a sistemas de tipos súper avanzados, podemos decir cosas como esta:
Definition divide x (y : {x : integer | x /= 0}) = x / y
Ahora el sistema de tipos garantiza que no haya errores de división por 0.
Que tipo de errores
Aquí hay una breve lista de qué errores pueden prevenir los sistemas de tipos
- Errores fuera de rango
- inyección SQL
- Generalizando 2, muchos problemas de seguridad (para qué sirve la comprobación de manchas en Perl )
- Errores fuera de secuencia (olvidando llamar a init)
- Forzar el uso de un subconjunto de valores (por ejemplo, solo enteros mayores que 0)
Gatitos nefastos (Sí, fue una broma)
- Errores de pérdida de precisión
- Errores de memoria transaccional de software (STM) (esto necesita pureza, que también requiere tipos)
- Generalizando 8, controlando los efectos secundarios
- Invariantes sobre las estructuras de datos (¿está equilibrado un árbol binario?)
- Olvidando una excepción o lanzando la incorrecta
Y recuerde, esto también es en tiempo de compilación . No es necesario escribir pruebas con una cobertura de código del 100% para simplemente verificar si hay errores de tipo, el compilador lo hace por usted :)
Estudio de caso: cálculo lambda mecanografiado
Muy bien, examinemos el más simple de todos los sistemas de tipo, simplemente cálculo lambda escrito .
Básicamente hay dos tipos,
Type = Unit | Type -> Type
Y todos los términos son variables, lambdas o aplicación. En base a esto, podemos probar que cualquier programa bien escrito finaliza. Nunca hay una situación en la que el programa se atasque o se repita para siempre. Esto no es demostrable en el cálculo lambda normal porque, bueno, no es cierto.
Piense en esto, podemos usar sistemas de tipos para garantizar que nuestro programa no se repita para siempre, sino genial, ¿verdad?
Desvío hacia tipos dinámicos
Los sistemas de tipo dinámico pueden ofrecer garantías idénticas a los sistemas de tipo estático, pero en tiempo de ejecución en lugar de en tiempo de compilación. En realidad, dado que es tiempo de ejecución, puedes ofrecer más información. Sin embargo, pierde algunas garantías, particularmente sobre propiedades estáticas como la terminación.
Por lo tanto, los tipos dinámicos no descartan ciertos programas, sino que enrutan programas mal formados a acciones bien definidas, como lanzar excepciones.
TLDR
Entonces, en resumen, los sistemas de tipos descartan ciertos programas. Muchos de los programas están rotos de alguna manera, por lo tanto, con los sistemas de tipos evitamos estos programas rotos.