El concepto esencial se aplica universalmente de alguna manera, sí, pero rara vez de manera útil.
Para comenzar, desde la perspectiva de la teoría de tipos, esto supone que los lenguajes "dinámicos" se consideran mejor como que tienen un solo tipo, que contiene (entre otras cosas) metadatos sobre la naturaleza del valor que ve el programador, incluido lo que estos lenguajes dinámicos llamarían un "tipo" en sí (que no es lo mismo, conceptualmente). Es probable que cualquier prueba de este tipo no sea interesante, por lo que este concepto es principalmente relevante para los lenguajes con sistemas de tipo estático.
Además, muchos lenguajes que supuestamente tienen un "sistema de tipos estático" deben considerarse dinámicos en la práctica, en este contexto, porque permiten la inspección y conversión de tipos en tiempo de ejecución. En particular, esto significa cualquier lenguaje con soporte incorporado por defecto para "reflexión" o similar. C #, por ejemplo.
Haskell es inusual en la cantidad de información que espera que proporcione un tipo, en particular, las funciones no pueden depender de ningún valor que no sean los especificados como sus argumentos. En un lenguaje con variables globales mutables, por otro lado, cualquier función puede (potencialmente) inspeccionar esos valores y cambiar el comportamiento en consecuencia. Por lo tanto, una función Haskell con tipo A -> B
puede considerarse como un programa en miniatura que demuestra que A
implica B
; una función equivalente en muchos otros idiomas solo nos dirá eso A
y lo que sea que sea el estado global en el alcance combinado implica B
.
Tenga en cuenta que si bien Haskell tiene soporte para cosas como la reflexión y los tipos dinámicos, el uso de tales características debe indicarse en la firma de tipo de una función; igualmente para el uso del estado global. Ninguno de los dos está disponible por defecto.
También hay formas de romper las cosas en Haskell, por ejemplo, permitiendo excepciones de tiempo de ejecución, o usando operaciones primitivas no estándar proporcionadas por el compilador, pero éstas tienen la gran expectativa de que solo se usarán con plena comprensión de formas que ganaron ' No dañar el significado del código externo. En teoría, se podría decir lo mismo de otros idiomas, pero en la práctica con la mayoría de los otros idiomas es más difícil lograr cosas sin "hacer trampa" y menos mal visto "hacer trampa". Y, por supuesto, en verdaderos lenguajes "dinámicos" todo el asunto sigue siendo irrelevante.
El concepto también puede llevarse mucho más lejos de lo que está en Haskell.