Recentemente, deparei-me com este post de Brian McKenna explicando o polimorfismo de linha. Pareceu-me uma ideia maravilhosa, mas então percebi que cheira muito a polimorfismo paramétrico limitado:
Com polimorfismo de linha:
sum: {x: int, y: int | rho} -> int
function sum r = r.x + r.y
Com polimorfismo paramétrico limitado:
sum: forall a <: {x: int, y: int}. a -> int
function sum r = r.x + r.y
Alguém pode esclarecer as diferenças de polimorfismo entre essas duas abordagens?
programming-languages
semantics
Gardenhead
fonte
fonte
let f x = x with {sum: x.a + x.b}
com os dois? Se bem entendi, o polimorfismo de linha permitirá que você mantenha quaisquer campos extras nox
polimorfismo paramétrico limitado, mas não porque você quer dizer que é do tipoforall a <: {x: int, y: int}. a -> a_with_a_new_field_sum
e acho que não pode expressara_with_a_new_field_sum
.with
construção. Como isso não foi apresentado no artigo, tentei evitá-lo, porque confunde as coisas.forget
operador que registre e remova um de seus campos. Então, para digitarfun r -> forget x of r
, você provavelmente também precisará de polimorfismo de linha.Respostas:
Portanto, existem algumas diferenças:
No polimorfismo de linha, você vincula a um nome para poder usá-lo em outro lugar. Por exemplo, é expressável com polimorfismo de linha, mas não puramente usando polimorfismo limitado. Da mesma forma, você pode até expressar a exclusão do campo desta maneira: é um tipo polimórfico de linha perfeitamente válido, mas a subtipagem não tem realmente uma maneira de expressar isso.ρ
forall rho . rho -> {x : int | rho}
forall rho .{x : int | rho} -> rho
Como o polimorfismo de linha permite adicionar e excluir campos dessa maneira, normalmente ele funciona com uma semântica de "pilha", para que os campos antigos sejam sombreados quando novos campos com o mesmo nome são adicionados.
Subtipagem limitada usa, bem, subtipagem. Portanto, com o polimorfismo de linha, você não pode dar
x : {x : int, y : int}
como argumento uma função do tipo{x : int} ->int
. Mas a maioria dos sistemas com subtipo limitado também teria subtipo não polimórfico, o que permitiria isso, já que a maioria dos sistemas possui{x : int} <: {x : int, y : int}
.A subtipagem limitada tende a ser um pouco mais precisa e flexível, e a semântica de "pilha" do polimorfismo de linha não ocorre muito. Mas a inferência é muito mais fácil para o polimorfismo de linha e pode funcionar na ausência de qualquer anotação de tipo (por exemplo, no Elm ), o que geralmente não é o caso na presença de subtipagem.
fonte