Porque o que está à direita dos dois pontos não é necessariamente um conjunto e o que está à esquerda dos dois pontos não é necessariamente um membro desse conjunto.
A teoria dos tipos começou no início do século XX como uma abordagem para o fundamento da matemática. Bertrand Russel descobriu um paradoxo na teoria dos conjuntos ingênua e trabalhou na teoria dos tipos como uma maneira de limitar o poder expressivo da teoria dos conjuntos para evitar esse (e qualquer outro) paradoxo. Ao longo dos anos, Russel e outros definiram muitas teorias de tipos. Em algumas teorias de tipos, os tipos são conjuntos com certas propriedades, mas em outras são um tipo diferente de animal.
Em particular, muitas teorias de tipos têm uma formulação sintática . Existem regras que fazem uma coisa ter um tipo. Quando as regras de digitação são usadas como base para uma teoria, é importante distinguir o que as regras de digitação dizem do que se pode inferir aplicando conhecimento externo adicional. Isso é especialmente importante se as regras de digitação são a base de uma teoria da prova: os teoremas que se sustentam com base na teoria dos conjuntos com lógica clássica e o axioma da escolha podem ou não se sustentar em uma lógica construtiva, por exemplo. Um dos trabalhos seminais neste domínio é Igreja 's A formulação da teoria simples de Tipos (1940)
Talvez a maneira pela qual a distinção entre tipos e conjuntos seja a mais aparente seja que a regra mais básica para conjuntos, ou seja, que dois conjuntos sejam iguais se tiverem os mesmos elementos, geralmente não se aplica a tipos. Veja a resposta de Andrej Bauer aqui e sua resposta em uma pergunta relacionada para alguns exemplos. Essa segunda discussão tem outras respostas que vale a pena ler.
Em um cálculo digitado, dizer que os tipos são conjuntos é de fato dar uma semântica aos tipos. Dar a um cálculo uma semântica da teoria dos tipos não é trivial. Por exemplo, suponha que você esteja definindo um idioma com funções. Que conjunto é um tipo de função? As funções totais são determinadas pelo seu gráfico, como aprendemos na teoria dos conjuntos 101. Mas e as funções parciais? Deseja atribuir a todas as funções que não terminam a mesma semântica? Você não pode interpretar tipos como conjuntos para um cálculo que permite funções recursivas até responder a essa pergunta. Dar linguagens de programação ou cálculos a uma semântica denotacional foi um problema difícil no início da década de 1970. O artigo seminal aqui é Para uma semântica matemática para linguagens de computador (1971) porDana Scott e Christopher Strachey . O wikibook Haskell tem uma boa apresentação do tópico.
Como escrevi acima, uma segunda parte da resposta é que, mesmo que você tenha conseguido dar aos tipos uma semântica teórica do conjunto, a coisa à esquerda do cólon nem sempre é um elemento do conjunto. Os valores têm tipos, mas o mesmo acontece com outras coisas, como expressões e variáveis . Por exemplo, uma expressão em uma linguagem de programação digitada tem um tipo mesmo que não seja finalizado. Você poderia estar disposto a confundir integer
e , mas não é um elemento de .ZZ(x := 0; while true; do x := x + 1; x)
Z
Não sei quando surgiu a notação do cólon para tipos. Agora é padrão em semântica e comum em linguagens de programação, mas nem Russel nem Church o usavam. Algol não o usou, mas a linguagem fortemente inspirada em Algol que Pascal usou em 1971. Porém, suspeito que não tenha sido o primeiro, porque muitos trabalhos teóricos do início dos anos 1970 usam a notação, mas não conheço um uso anterior. Curiosamente, isso ocorreu logo após a unificação dos conceitos de tipos de programação e de lógica - como mostra Simon Martini em Vários tipos de tipos em linguagens de programação , o que foi chamado de “tipo” em linguagens de programação até os anos 1960 veio do vernáculo uso da palavra e não da teoria dos tipos.