Vindo de um background em C ++, não entendo por que precisamos de tipos / expressões de tipo como cidadão de primeira classe? O único idioma que conheço que suporta esse recurso é o Aldor.
Alguém tem alguma literatura sobre tipos como cidadão de primeira classe ou conhece alguns motivos pelos quais é útil?
Respostas:
Os tipos de primeira classe ativam algo chamado digitação dependente . Isso permite que o programador use valores de tipos no nível de tipo. Por exemplo, o tipo de todos os pares de números inteiros é um tipo regular, enquanto o par de todos os números inteiros com o número esquerdo menor que o número direito é um tipo dependente. O exemplo introdutório padrão disso são as listas codificadas em tamanho (normalmente chamadas
Vector
em Haskell / Idris). O pseudocódigo a seguir é uma mistura de Idris e Haskell.Este pedaço de código nos diz duas coisas:
cons
inserir um elemento em uma lista cria uma lista de comprimenton + 1
Isso parece muito semelhante a outro conceito com 0 e
n + 1
não é? Eu voltarei a isso.O que ganhamos com isso? Agora podemos determinar propriedades adicionais das funções que usamos. Por exemplo: Uma propriedade importante de
append
é que o comprimento da lista resultante seja a soma dos comprimentos das duas listas de argumentos:Mas, apesar de tudo, essa técnica não parece útil na programação cotidiana. Como isso se relaciona com soquetes,
POST
/GET
solicitações e assim por diante?Bem, não (pelo menos não sem um esforço considerável). Mas pode nos ajudar de outras maneiras:
Tipos dependentes nos permitem formular invariantes em regras de código como o modo como uma função deve se comportar. Usando isso, obtemos segurança adicional sobre o comportamento do código, semelhante às pré e pós-condições de Eiffel. Isso é extremamente útil para a prova automatizada de teoremas, que é um dos possíveis usos para Idris.
Voltando ao exemplo acima, a definição de listas codificadas em comprimento se assemelha ao conceito matemático de indução . Em Idris, você pode realmente formular o conceito de indução em uma lista da seguinte maneira:
Essa técnica é limitada a provas construtivas, mas ainda assim é muito poderosa. Você pode tentar escrever
append
indutivamente como um exercício.Obviamente, tipos dependentes são apenas um dos tipos de primeira classe, mas é sem dúvida um dos mais comuns. Usos adicionais incluem, por exemplo, retornar um tipo específico de uma função com base em seus argumentos.
Este é um exemplo sem sentido, mas demonstra algo que você não pode emular sem os tipos de primeira classe.
fonte