O conceito essencial se aplica universalmente de alguma maneira, sim, mas raramente de uma maneira útil.
Para começar, da perspectiva da teoria dos tipos, isso pressupõe que as linguagens "dinâmicas" sejam melhor consideradas como tendo um único tipo, que contém (entre outras coisas) metadados sobre a natureza do valor que o programador vê, incluindo o que essas linguagens dinâmicas chamariam um "tipo" em si (que não é a mesma coisa, conceitualmente). É provável que essas provas não sejam interessantes, portanto esse conceito é principalmente relevante para idiomas com sistemas de tipo estático.
Além disso, muitos idiomas que supostamente possuem um "sistema de tipo estático" devem ser considerados dinâmicos na prática, nesse contexto, porque permitem inspeção e conversão de tipos em tempo de execução. Em particular, isso significa qualquer idioma com suporte interno padrão para "reflexão" ou algo semelhante. C #, por exemplo.
Haskell é incomum na quantidade de informações que espera que um tipo forneça - em particular, as funções não podem depender de nenhum valor além dos especificados como argumentos. Em uma linguagem com variáveis globais mutáveis, por outro lado, qualquer função pode (potencialmente) inspecionar esses valores e alterar o comportamento de acordo. Assim, uma função Haskell com o tipo A -> B
pode ser considerado como uma prova programa miniatura que A
implica B
; uma função equivalente em muitas outras línguas apenas nos diria que A
e qualquer estado global que esteja no escopo combinado implica B
.
Observe que, embora o Haskell tenha suporte para coisas como reflexão e tipos dinâmicos, o uso desses recursos deve ser indicado na assinatura de tipo de uma função; da mesma forma para o uso do estado global. Nenhum dos dois está disponível por padrão.
Não são maneiras de quebrar as coisas em Haskell, bem como, por exemplo, permitindo exceções de tempo de execução, ou usando operações primitivas não-padrão fornecidos pelo compilador, mas aqueles vêm com uma forte expectativa de que eles só serão utilizadas com plena compreensão de maneiras que ganharam' t danifica o significado do código externo. Em teoria, o mesmo poderia ser dito de outras línguas, mas, na prática, com a maioria das outras línguas, é mais difícil realizar as coisas sem "trapacear" e menos desaprovado em "trapacear". E, claro, nas verdadeiras linguagens "dinâmicas", a coisa toda permanece irrelevante.
O conceito pode ser levado muito mais longe do que em Haskell também.