Muy bien, vamos uno por uno.
Valores
Los valores son los datos concretos que los programas evalúan y hacen malabares. Nada de lujos, algunos ejemplos podrían ser
1
true
"fizz buzz foo bar"
Tipos
Una buena descripción para un tipo es "un clasificador para un valor". Un tipo es un poco de información sobre cuál será ese valor en tiempo de ejecución, pero indicado en tiempo de compilación.
Por ejemplo, si me dices eso e : bool
en tiempo de compilación, y sabré que e
es true
o false
durante el tiempo de ejecución, ¡nada más! Debido a que los tipos clasifican valores muy bien como este, podemos usar esta información para determinar algunas propiedades básicas de su programa.
Por ejemplo, si alguna vez te veo agregando e
y e'
cuándo e : int
y e' : String
, entonces sé que algo está un poco mal. De hecho, puedo marcar esto y arrojar un error en el momento de la compilación, diciendo "¡Hey, eso no tiene ningún sentido!".
Un sistema de tipos más potente permite tipos más interesantes que clasifican valores más interesantes. Por ejemplo, consideremos alguna función
f = fun x -> x
Está bastante claro eso f : Something -> Something
, pero ¿qué debería Something
ser? En un sistema de tipo aburrido, tendríamos que especificar algo arbitrario, como Something = int
. En un sistema de tipos más flexible, podríamos decir
f : forall a. a -> a
Es decir "para cualquiera a
, f
asigna un an a
a un a
". Esto nos permite usar de manera f
más general y escribir programas más interesantes.
Además, el compilador comprobará si realmente satisface el clasificador que le hemos dado, si f = fun x -> true
tenemos un error y el compilador lo dirá.
Entonces como tldr; un tipo es una restricción de tiempo de compilación en los valores que una expresión puede ser en tiempo de ejecución.
Constructor de tipos
Algunos tipos están relacionados. Por ejemplo, una lista de enteros es muy similar a una lista de cadenas. Esto es casi como sort
para los enteros es casi como sort
para las cadenas. Podemos imaginar una especie de fábrica que construya estos tipos casi iguales generalizando sobre sus diferencias y construyéndolas a pedido. Eso es un constructor de tipo. Es como una función de tipos a tipos, pero un poco más limitada.
El ejemplo clásico es una lista genérica. Un constructor de tipos para es solo la definición genérica
data List a = Cons a (List a) | Nil
¡Ahora List
es una función que asigna un tipo a
a una lista de valores de ese tipo! En Java-land creo que a estas quizás se les llame "clases genéricas"
Parámetros de tipo
Un parámetro de tipo es solo el tipo pasado a un constructor de tipo (o función). Al igual que en el nivel de valor, diríamos que foo(a)
tiene un parámetro a
igual que cómo List a
tiene un parámetro de tipo a
.
Tipos
Los tipos son un poco complicados. La idea básica es que ciertos tipos son similares. Por ejemplo, tenemos todos los tipos primitivos de Java int
, char
, float
..., que todos se comportan como si tuvieran el mismo "tipo". Excepto, cuando hablamos de los clasificadores para los tipos en sí, llamamos a los clasificadores tipos. Así int : Prim
, String : Box
, List : Boxed -> Boxed
.
Este sistema proporciona buenas reglas concretas sobre qué tipo de tipos podemos usar dónde, al igual que cómo los tipos gobiernan los valores. Claramente sería una tontería decir
List<List>
o
List<int>
¡En Java ya List
que debe aplicarse a un tipo concreto para usarse así! Si miramos sus tipos List : Boxed -> Boxed
y desde entonces Boxed -> Boxed /= Boxed
, ¡lo anterior es un error amable!
La mayoría de las veces no pensamos realmente en los tipos y simplemente los tratamos como "sentido común", pero con los sistemas de tipos más sofisticados es algo importante en lo que pensar.
Una pequeña ilustración de lo que he estado diciendo hasta ahora
value : type : kind : ...
true : bool : Prim : ...
new F() : Foo : Boxed : ...
Mejor lectura que Wikipedia
Si está interesado en este tipo de cosas, le recomiendo invertir un buen libro de texto. La teoría de tipos y PLT en general es bastante amplia y sin una base coherente de conocimiento, usted (o al menos yo) puede deambular sin llegar a ningún lado durante meses.
Dos de mis libros favoritos son
- Tipos y lenguaje de programación - Ben Pierce
- Fundamentos prácticos de los lenguajes de programación - Bob Harper
Ambos son excelentes libros que presentan lo que acabo de hablar y mucho más con detalles hermosos y bien explicados.