Tudo bem, vamos um por um.
Valores
Os valores são os dados concretos que os programas avaliam e manipulam. Nada extravagante, alguns exemplos podem ser
1
true
"fizz buzz foo bar"
Tipos
Uma boa descrição para um tipo é "um classificador para um valor". Um tipo é um pouco de informação sobre qual será esse valor em tempo de execução, mas indicado em tempo de compilação.
Por exemplo, se você me disser isso e : bool
em tempo de compilação, e eu saberei que e
é true
oufalse
durante durante o tempo de execução, nada mais! Como os tipos classificam valores dessa maneira, podemos usar essas informações para determinar algumas propriedades básicas do seu programa.
Por exemplo, se eu vejo você adicionando e
e e'
quando e : int
ee' : String
, então sei que algo está um pouco errado! Na verdade, posso sinalizar isso e gerar um erro no momento da compilação, dizendo "Ei, isso não faz nenhum sentido!".
Um sistema de tipos mais poderoso permite tipos mais interessantes que classificam valores mais interessantes. Por exemplo, vamos considerar alguma função
f = fun x -> x
É bem claro isso f : Something -> Something
, mas o que deveria Something
ser? Em um sistema de tipo chato, teríamos que especificar algo arbitrário, como Something = int
. Em um sistema de tipo mais flexível, poderíamos dizer
f : forall a. a -> a
Ou seja, "para qualquer a
, f
mapeia um a
para um a
". Isso vamos usarf
mais geral e escrever programas mais interessantes.
Além disso, o compilador verificará realmente satisfazendo o classificador que fornecemos, se f = fun x -> true
tivermos um bug e o compilador o dirá!
Então, como um tldr; um tipo é uma restrição de tempo de compilação nos valores que uma expressão pode estar no tempo de execução.
Tipo Construtor
Alguns tipos estão relacionados. Por exemplo, uma lista de números inteiros é muito semelhante a uma lista de seqüências de caracteres. É quase como se sort
for números inteiros é quase como sort
para strings. Podemos imaginar um tipo de fábrica que constrói esses tipos quase iguais generalizando suas diferenças e construindo-as sob demanda. Isso é o que é um construtor de tipos. É como uma função de tipos para tipos, mas um pouco mais limitada.
O exemplo clássico é uma lista genérica. Um construtor de tipo para é apenas a definição genérica
data List a = Cons a (List a) | Nil
Agora List
é uma função que mapeia um tipoa
para uma lista de valores desse tipo! Na terra de Java, acho que essas talvez sejam chamadas de "classes genéricas"
Parâmetros de tipo
Um parâmetro de tipo é apenas o tipo passado para um construtor de tipo (ou função). Assim como no nível de valor, diríamos que foo(a)
tem um parâmetro, a
assim como o List a
parâmetro de tipo a
.
Tipos
Tipos são um pouco complicados. A idéia básica é que certos tipos são semelhantes. Por exemplo, nós temos todos os tipos primitivos em java int
, char
, float
... que todos se comportam como se eles têm o mesmo "tipo". Exceto, quando falamos dos classificadores para os próprios tipos, chamamos os tipos de classificadores. Assim int : Prim
, String : Box
, List : Boxed -> Boxed
.
Esse sistema fornece boas regras concretas sobre que tipo de tipos podemos usar onde, exatamente como os tipos governam os valores. Seria claramente um absurdo dizer
List<List>
ou
List<int>
Em Java, desde que List
precisa ser aplicado a um tipo concreto para ser usado assim! Se olharmos para os seus tipos List : Boxed -> Boxed
e Boxed -> Boxed /= Boxed
, desde então , o erro acima é um tipo!
Na maioria das vezes, não pensamos nos tipos e apenas os tratamos como "senso comum", mas com sistemas de tipos mais sofisticados é algo importante para se pensar.
Uma pequena ilustração do que venho dizendo até agora
value : type : kind : ...
true : bool : Prim : ...
new F() : Foo : Boxed : ...
Melhor leitura que a Wikipedia
Se você estiver interessado nesse tipo de coisa, eu recomendo investir um bom livro. A teoria dos tipos e o PLT em geral são bastante vastos e sem uma base coerente de conhecimento, você (ou pelo menos eu) pode passear sem chegar a lugar nenhum por meses.
Dois dos meus livros favoritos são
- Tipos e linguagem de programação - Ben Pierce
- Fundamentos práticos de linguagens de programação - Bob Harper
Ambos são excelentes livros que apresentam o que acabei de falar e muito mais em detalhes bonitos e bem explicados.