Los sistemas de tipos evitan errores
Los sistemas de tipos eliminan los programas ilegales. Considera 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 , como sea, este no 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 hay errores de división por 0.
¿Qué tipo de errores
Aquí hay una breve lista de los errores que pueden evitar los sistemas de tipos
- Errores fuera de rango
- inyección SQL
- Generalizar 2, muchos problemas de seguridad (para lo que comprobación de manchas es 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 nefarios (Sí, era una broma)
- Errores de pérdida de precisión
-
Errores de memoria transaccional del software (STM) (esto requiere pureza, que también requiere tipos)
- Generalizar 8, controlar los efectos secundarios
- Invariantes sobre estructuras de datos (¿está equilibrado un árbol binario?)
- Olvidando una excepción o lanzando la incorrecta
Y recuerda, esto también está en compilar a la vez. No es necesario escribir pruebas con una cobertura de código del 100% para verificar simplemente los errores de tipo, el compilador simplemente lo hace por usted :)
Estudio de caso: cálculo lambda mecanografiado
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 termina. Nunca hay una situación en la que el programa se atasque o se duplique para siempre. Esto no es demostrable en el cálculo lambda normal porque, bueno, no es cierto.
Piensa en esto, podemos usar sistemas de tipos para garantizar que nuestro programa no se ejecute nunca, más bien, ¿no?
desvío en 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 tiempo de compilación. En realidad, dado que es tiempo de ejecución, puedes ofrecer más información. Sin embargo, se pierden algunas garantías, especialmente 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
Por lo tanto, a largo plazo, los sistemas de tipos descartan ciertos programas. Muchos de los programas están rotos de alguna manera, por lo tanto, con los sistemas de tipo evitamos estos programas rotos.