La réponse courte est "pour vérifier les propriétés supplémentaires du code existant". Une réponse plus longue suit.
Je ne suis pas sûr que «implicite» vs «explicite» soit une bonne terminologie. Cette distinction est parfois appelée sous-typage "structurel" vs "nominal". Ensuite, il y a aussi une deuxième distinction dans les interprétations possibles du sous-typage structurel (décrites brièvement). Notez que les trois interprétations du sous-typage sont vraiment orthogonales, et qu'il n'est donc pas vraiment logique de les comparer les unes aux autres, plutôt que de comprendre les utilisations de chacune.
La principale distinction opérationnelle dans l'interprétation d'une relation structurelle de sous-typage A <: B est de savoir si elle est attestée par une contrainte réelle avec un contenu informatique (runtime / compiletime), ou si elle peut être attestée par la contrainte d'identité. Dans le premier cas, la propriété théorique importante qui doit être respectée est la "cohérence", c'est-à-dire s'il existe plusieurs façons de montrer que A est un sous-type sous-structurel de B, chacune des contraintes qui l'accompagnent doit avoir le même contenu informatique.
Le lien que vous avez donné semble avoir la deuxième interprétation du sous-typage structurel à l'esprit, où A <: B peut être observé par la contrainte d'identité. Ceci est parfois appelé une "interprétation de sous-ensemble" du sous-typage, prenant la vue naïve qu'un type représente un ensemble de valeurs, et donc A <: B juste au cas où chaque valeur de type A est également une valeur de type B. Elle est également parfois appelé "raffinement typage", et un bon article à lire pour la motivation originale est Freeman & Pfenning types de raffinement pour ML . Pour une incarnation plus récente en F #, vous pouvez lire Bengston et al, Refinement types for secure implementations. L'idée de base est de prendre un langage de programmation existant qui peut (ou non) avoir déjà des types mais dans lequel les types ne garantissent pas tant que ça (par exemple, seulement la sécurité de la mémoire), et envisager une deuxième couche de types sélectionnant des sous-ensembles de programmes avec propriétés supplémentaires et plus précises.
(Maintenant, je dirais que la théorie mathématique derrière cette interprétation du sous-typage n'est toujours pas aussi bien comprise qu'elle devrait l'être, et peut-être parce que ses utilisations ne sont pas aussi largement appréciées qu'elles devraient l'être. Un problème est que le "set des valeurs ", l'interprétation des types est trop naïve, et donc parfois elle est abandonnée plutôt que raffinée. Pour un autre argument selon lequel cette interprétation du sous-typage mérite plus d'attention mathématique, lisez l'introduction aux sous- espaces de Paul Taylor dans la dualité de la pierre abstraite .)