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?
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 digitar fun r -> forget x of r
, você provavelmente também precisará de polimorfismo de linha.
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
.