Les systèmes de types préviennent les erreurs
Les systèmes de types éliminent les programmes illégaux. Considérez le code Python suivant.
a = 'foo'
b = True
c = a / b
En Python, ce programme échoue. il jette une exception. Dans un langage comme Java, C #, Haskell , peu importe, ce n'est même pas un programme légal. Vous évitez entièrement ces erreurs car elles ne sont tout simplement pas possibles dans l'ensemble des programmes d'entrée.
De même, un meilleur système de types exclut plus d'erreurs. Si nous sautons aux systèmes de types super avancés, nous pouvons dire des choses comme celle-ci:
Definition divide x (y : {x : integer | x /= 0}) = x / y
Maintenant, le système de types garantit qu’il n’ya pas d’erreur de division par 0.
Quel genre d'erreurs
Voici une brève liste de ce que les systèmes de types d'erreur peuvent éviter
- Erreurs hors de portée
- Injection SQL
- En généralisant 2, de nombreux problèmes de sécurité (à quoi sert la vérification des altérations dans Perl )
- Erreurs hors séquence (oubli d'appeler init)
- Forcer l'utilisation d'un sous-ensemble de valeurs (par exemple, seuls les entiers supérieurs à 0)
Chatons néfastes (Oui, c'était une blague)
- Erreurs de perte de précision
- Erreurs de mémoire logicielle transactionnelle (STM) (cela nécessite de la pureté, ce qui nécessite également des types)
- Généraliser 8, contrôler les effets secondaires
- Invariants sur des structures de données (un arbre binaire est-il équilibré?)
- Oublier une exception ou jeter la mauvaise
Et rappelez-vous, ceci est également au moment de la compilation . Nul besoin d'écrire des tests avec une couverture de code à 100% pour simplement vérifier les erreurs de type, le compilateur le fait pour vous :)
Étude de cas: lambda calcul typé
Très bien, examinons le plus simple de tous les systèmes de types, simplement le lambda calcul .
Fondamentalement, il existe deux types,
Type = Unit | Type -> Type
Et tous les termes sont soit des variables, des lambdas ou des applications. Sur cette base, nous pouvons prouver que tout programme bien typé se termine. Il n'y a jamais une situation où le programme va rester bloqué ou en boucle pour toujours. Ce n'est pas prouvable dans le calcul lambda normal parce que, bien, ce n'est pas vrai.
Pensez-y, nous pouvons utiliser des systèmes de types pour garantir que notre programme ne fonctionne pas en boucle pour toujours, plutôt cool, non?
Détournez dans les types dynamiques
Les systèmes de types dynamiques peuvent offrir des garanties identiques aux systèmes de types statiques, mais au moment de l'exécution plutôt que lors de la compilation. En fait, puisque c'est le temps d'exécution, vous pouvez réellement offrir plus d'informations. Vous perdez cependant certaines garanties, en particulier concernant les propriétés statiques telles que la terminaison.
Ainsi, les types dynamiques n'excluent pas certains programmes, mais orientent plutôt les programmes mal formés vers des actions bien définies, telles que le lancement d'exceptions.
TLDR
En résumé, les systèmes de types excluent certains programmes. Beaucoup de programmes sont cassés d'une certaine manière, par conséquent, avec les systèmes de types, nous évitons ces programmes cassés.