Quais são as principais diferenças entre polimorfismo de linha e subtipagem

20

Ouvi muitas vezes que o polimorfismo de linha é uma abordagem melhor do que a subtipagem, mas tenho dificuldade em encontrar algo que as compare em detalhes. Estou especialmente interessado na perspectiva de um usuário do sistema.

Me deparei com este post do blog, mas ele me deixa com mais perguntas do que antes. Por exemplo, afirma que um sistema com subtipagem atribui um tipo, enquanto um sistema com digitação de linha atribui outro; isso significa que, se um sistema que supostamente possui subtipagem atribui o tipo "digitação de linha", isso significa incorretamente?

A única grande diferença que vejo é que a digitação de linha torna possível alinhar os tipos de argumentos (ou seja, escrever uma função de dois argumentos que se preocupa apenas com o acampo de seus argumentos, mas requer que seus argumentos tenham os mesmos campos) .

Alex R
fonte

Respostas:

10

A subtipagem diz que, dada uma expressão de um tipo, também podemos dar outro. Dizemos que o primeiro é um subtipo do último e esse relacionamento de subtipo induz muitos outros relacionamentos. Em símbolos,

ΓE:SS<:TΓE:T

(α.τ)<:τ[T/α]T

{1:UMA,2:B}<:{2:B,1:UMA}{1:UMA,2:B}{2:B,1:UMA}STS<:TT<:S{1:UMA,2:B}={2:B,1:UMA}T<:T

Normalmente, quando falamos de uma língua com subtipagem que uma média com uma relação de subtipos não-trivial em terra tipos, tipos ou seja, sem variáveis livres (que, é claro, pode e irá gerar relacionamentos Subtipagem para tipos não-terra). Portanto, um sistema com polimorfismo de linha como o de Roy não é uma linguagem com subtipagem nesse sentido, embora tenha uma relação de subtipo não trivial que vem de qualquer linguagem polimórfica paramétrica implicitamente instanciada. A subtipagem estrutural, por outro lado, declara explicitamente relacionamentos de subtipagem não triviais para tipos de solo.

()acima, a subtipagem estrutural implica tipos de linha, mas não vice-versa. O polimorfismo paramétrico é ortogonal (no sentido em que você pode ou não ter, definitivamente existem interações) para tipos de linhas ou subtipos estruturais. Um sistema com subtipo estrutural + polimorfismo paramétrico substitui o tipo de linha + polimorfismo paramétrico (assumindo algum tipo de "união de registros") no sentido de que cada termo no último pode ser digitado com o mesmo tipo no primeiro. O primeiro também é capaz de digitar com outros tipos também. Usando o exemplo de Brian, em um sistema com subtipagem estrutural e polimorfismo paramétrico answerteria o mesmo tipo como na versão de linha de digitação, mas também teria o tipo da versão subtipos bem .

ρ{ c : Number }informação: passar de um subtipo para um supertipo perde (tipo) informações. Muitas vezes, isso pode ser o que você deseja: existe um tipo comum de seu interesse e todo o resto são detalhes irrelevantes. Minha tendência é manter o máximo possível de informações de tipo e descartá-las explicitamente. As desvantagens da abordagem de subtipagem são frequentemente evidenciadas por programas com o tipo correto, mas apenas porque os tipos foram enviados para um tipo "superior" (n sem informações), por exemplo, o registro vazio. Reiterando, o polimorfismo paramétrico (em geral) preserva as informações de tipo, subtipando-as intencionalmente.

Derek Elkins
fonte
Obrigado pela resposta detalhada! Outra pergunta: se subtipo estrutural + polimorfismo paramétrico subsumem digitação de linha + polimorfismo paramétrico, por que você usaria o último?
Alex R
@AlexR Como Brian mencionou em seu blog, a subtipagem interage extremamente mal com a inferência de tipos e muitos outros aspectos, como a questão ergonômica que mencionei. Há também problemas de implementação e complexidade de linguagem. Para ser justo, existe um amplo espaço de design para os "tipos de linha" e subtipagem; portanto, o "subsume" é uma afirmação grosseira.
Derek Elkins