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?
withKonstrukts ab. Da dies im Artikel nicht dargelegt wurde, habe ich versucht, es zu vermeiden, weil es die Dinge verwirrt.
forgetOperator haben, der einen Datensatz aufnimmt und eines seiner Felder entfernt. Zum fun r -> forget x of rTippen 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 imxbegrenzten 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_sumund ich glaube nicht, dass Sie dies ausdrücken könnena_with_a_new_field_sum.