Ich bin kürzlich auf diesen Blog-Beitrag von Brian McKenna gestoßen, der den Zeilenpolymorphismus erklärt. Das schien mir eine wundervolle Idee zu sein, aber dann wurde mir klar, dass es sehr nach begrenztem parametrischem Polymorphismus riecht:
Mit Zeilenpolymorphismus:
sum: {x: int, y: int | rho} -> int
function sum r = r.x + r.y
Mit begrenztem parametrischem Polymorphismus:
sum: forall a <: {x: int, y: int}. a -> int
function sum r = r.x + r.y
Kann jemand die Unterschiede zum Polymorphismus zwischen diesen beiden Ansätzen klären?
with
Konstrukts ab. Da dies im Artikel nicht dargelegt wurde, habe ich versucht, es zu vermeiden, weil es die Dinge verwirrt.
forget
Operator haben, der einen Datensatz aufnimmt und eines seiner Felder entfernt. Zum fun r -> forget x of r
Tippen benötigen Sie wahrscheinlich auch Zeilenpolymorphismus.
let f x = x with {sum: x.a + x.b}
mit beiden zu tippen ? Wenn ich das richtig verstehe, können Sie mit dem Zeilenpolymorphismus alle zusätzlichen Felder imx
begrenzten parametrischen Polymorphismus beibehalten, da Sie sagen möchten, dass dies ein Typ ist,forall a <: {x: int, y: int}. a -> a_with_a_new_field_sum
und ich glaube nicht, dass Sie dies ausdrücken könnena_with_a_new_field_sum
.