La risposta breve è "verificare proprietà aggiuntive del codice esistente". Segue una risposta più lunga.
Non sono sicuro che "implicito" vs "esplicito" sia una buona terminologia. Questa distinzione è talvolta chiamata sottotipizzazione "strutturale" vs "nominale". Vi è poi anche una seconda distinzione nelle possibili interpretazioni del sottotipo strutturale (descritte a breve). Nota che tutte e tre le interpretazioni del sottotipo sono davvero ortogonali, e quindi non ha davvero senso confrontarle tra loro, piuttosto che comprendere gli usi di ciascuno.
La principale distinzione operativa nell'interpretazione di una relazione di sottotipo strutturale A <: B è se è assistito da una vera coercizione con contenuto computazionale (runtime / compiletime) o se può essere assistito dalla coercizione dell'identità. Se la prima, l'importante proprietà teorica che deve avere è la "coerenza", cioè se ci sono diversi modi per dimostrare che A è un sottotipo di sottostruttura di B, ciascuna delle coercizioni che la accompagnano deve avere lo stesso contenuto computazionale.
Il collegamento che hai dato sembra avere in mente la seconda interpretazione del sottotipo strutturale, in cui A <: B può essere testimoniato dalla coercizione dell'identità. Questa è talvolta chiamata "interpretazione di sottoinsieme" del sottotipo, considerando l'ingenua visione che un tipo rappresenta un insieme di valori, e quindi A <: B nel caso in cui ogni valore di tipo A sia anche un valore di tipo B. È anche a volte chiamato "refinement typing", e un buon documento da leggere per la motivazione originale sono i tipi di affinamento di Freeman & Pfenning per ML . Per una più recente incarnazione in F #, puoi leggere Bengston et al, Tipi di perfezionamento per implementazioni sicure. L'idea di base è quella di prendere un linguaggio di programmazione esistente che potrebbe (o potrebbe non avere) già dei tipi ma in quali tipi non garantisce così tanto (ad esempio, solo la sicurezza della memoria) e prendere in considerazione un secondo livello di tipi selezionando sottoinsiemi di programmi con proprietà aggiuntive e più precise.
(Ora, direi che la teoria matematica alla base di questa interpretazione del sottotipo non è ancora ben compresa come dovrebbe essere, e forse è perché i suoi usi non sono così ampiamente apprezzati come dovrebbero. Un problema è che il "set di valori "l'interpretazione dei tipi è troppo ingenua, e quindi a volte viene abbandonata anziché perfezionata. Per un altro argomento secondo cui questa interpretazione del sottotipo merita più attenzione matematica, leggi l'introduzione ai Sottospazi di Paul Taylor in Abstract Stone Duality .)