Il concetto essenziale si applica universalmente in qualche modo, sì, ma raramente in modo utile.
Innanzitutto, dal punto di vista della teoria dei tipi ciò presuppone, si ritiene che i linguaggi "dinamici" abbiano un solo tipo, che contiene (tra le altre cose) metadati sulla natura del valore che il programmatore vede, incluso ciò che questi linguaggi dinamici chiamerebbero un "tipo" stesso (che non è la stessa cosa, concettualmente). È probabile che tali prove non siano interessanti, quindi questo concetto è principalmente rilevante per le lingue con sistemi di tipo statico.
Inoltre, molte lingue che presumibilmente hanno un "sistema di tipi statici" devono essere considerate pratiche nella pratica, in questo contesto, perché consentono l'ispezione e la conversione dei tipi in fase di esecuzione. In particolare, ciò significa qualsiasi linguaggio con supporto predefinito incorporato per "riflessione" o simili. C #, per esempio.
Haskell è insolito in quante informazioni si aspetta da un tipo - in particolare, le funzioni non possono dipendere da alcun valore diverso da quelli specificati come argomenti. In un linguaggio con variabili globali mutabili, d'altra parte, qualsiasi funzione può (potenzialmente) ispezionare quei valori e cambiare il comportamento di conseguenza. Quindi, una funzione Haskell con il tipo A -> B
può essere considerato come un programma proving in miniatura che A
implica B
; una funzione equivalente in molte altre lingue ci direbbe solo questo A
e qualunque cosa lo stato globale rientri nell'ambito di applicazione implica B
.
Si noti che mentre Haskell ha supporto per cose come la riflessione e i tipi dinamici, l' uso di tali caratteristiche deve essere indicato nella firma del tipo di una funzione; allo stesso modo per l'uso dello stato globale. Nessuno dei due è disponibile per impostazione predefinita.
Ci sono modi per rompere le cose in Haskell così, ad esempio consentendo eccezioni runtime, o utilizzando le operazioni primitive non standard forniti dal compilatore, ma quelli dotati di una forte aspettativa che saranno utilizzati solo con la piena comprensione in modi che ha vinto' danneggiare il significato del codice esterno. In teoria si potrebbe dire lo stesso di altre lingue, ma in pratica con la maggior parte delle altre lingue è sia più difficile realizzare le cose senza "imbrogliare", sia meno malvisto a "imbrogliare". E ovviamente nelle vere lingue "dinamiche" il tutto rimane irrilevante.
Il concetto può essere portato molto oltre rispetto a quello di Haskell.