Die Richtlinie für die Paketversionierung gibt an, dass die Änderung des Typs einer Entität eine Änderung des B Nummer in ABC notwendig.
Es scheint mir jedoch, dass einige Typänderungen den abhängigen Code nicht unterbrechen. Betrachten Sie insbesondere das folgende Beispiel, in dem ich eine Typeable
-Klassenbeschränkung ablege:
Also, meine Frage ist:
Kann eine Typklasseneinschränkung für einen funktionsunterbrechungsabhängigen Code entfernt werden? Soll ich die B Nummer oder nur das C in Version A.B.C ändern, wenn ich diese Änderung einführe?
Ich habe auf -cafe geantwortet, aber ich werde auch meine Antwort hier setzen:
Sie sollten die C-Nummer stoßen. Der PVP , Regel 2, gibt an, dass ein API-Zusatz impliziert, dass der C-Teil der Version erhöht werden soll. Das Entfernen einer Einschränkung verhält sich ähnlich wie das Hinzufügen einer neuen Funktion: Code, der zuvor funktioniert hat, funktioniert weiterhin, aber Code, der für die neue API geschrieben wurde, funktioniert möglicherweise nicht gegen die alte.
Wenn also ein Programmierer Code gegen Version 0.1.2 von foo entwickelt, würde er foo >= 0.1.2 && < 0.2
als Voraussetzung angeben. Er erwartet nicht, dass sein Code gegen foo-0.1.1 arbeitet. Dies funktioniert gut mit dem Entfernen der Einschränkung.
Nein , das glaube ich nicht. Hier ist meine Argumentation. Es ist üblich, Einschränkungen als zusätzliches Funktionsargument zu betrachten: ein Typklassenwörterbuch, das implizit übergeben wird. Sie können etwas allgemeiner denken und sich vorstellen, dass Constraints eine Aufzeichnung von Evidenzen sind, die implizit übergeben wird. Daher kann der TypKann eine Typklasseneinschränkung für einen funktionsunterbrechungsabhängigen Code entfernt werden?
Foo
als {} -> Foo
betrachtet werden, wobei {}
eine leere Aufzeichnung impliziter Beweise angibt. Es ist irrelevant, ob Foo
selbst eine Funktion ist oder nicht.
Nehmen Sie nun an, dass unsere API etwas vom Typ verspricht
%Vor%Aber was wir tatsächlich liefern, ist
%Vor%Nun, Record Subtyping sagt uns, dass
%Vor%daher sagt Funktion Subtyping, dass
%Vor% Also, irgendwo in jemandes Programm, dass wir ein Loch mit der Form {SomeConstraint} -> Foo
finden, können wir ein {} -> Foo
einbinden. Mit anderen Worten, nichts bricht. Der Benutzer gibt uns den Beweis, dass SomeConstraint
erfüllt ist, und wir ignorieren es einfach.
Zuerst dachte ich, dass komische Fälle in der Typinferenz Probleme verursachen könnten, aber ich kann mir keine Beispiele vorstellen, wo dies tatsächlich der Fall ist. Dieser Gedanke wurde also durch Erschöpfung der Vorstellungskraft als falsch erwiesen.