Also habe ich in meiner F # -Reise aufgenommen und sie wirken zunächst ziemlich gefährlich. Zuerst schien das schlau:
%Vor%Die Idee, dass der CardA Patten mit Card übereinstimmt. Ganz zu schweigen von dem vereinfachten Mustervergleich:
%Vor%Problem ist:
%Vor%cardA ist jetzt vom Typ CardTwo, was wohl mit F # zu tun hat, wenn alles in der richtigen Reihenfolge läuft.
Nun könnte dies eine unmögliche Situation sein, da es niemals die Möglichkeit gibt, dass die gleiche Signatur zwei Typen annimmt, aber es ist eine Möglichkeit.
Zeichnet man etwas auf, das nur bedingt nützlich ist, oder überlege ich das gerade?
Sie sind nicht gefährlich und sie sind nicht nur für begrenzte Verwendung.
Ich denke, es ist sehr selten, dass Sie zwei Typen mit denselben Mitgliedern haben. Wenn Sie jedoch auf diese Situation stoßen, können Sie den zu verwendenden Datensatztyp qualifizieren:
%Vor%Datensätze sind sehr nützlich, um (meist) unveränderbare Datenstrukturen zu erstellen. Und die Tatsache, dass Sie leicht eine Kopie mit nur einigen geänderten Feldern erstellen können, ist auch großartig:
%Vor%Ich stimme zu, Felder als Mitglieder des umschließenden Moduls / Namespace aufzuzeichnen, erscheint zunächst seltsam, wenn sie von traditionelleren OO-Sprachen kommen. Aber F # bietet hier eine gewisse Flexibilität. Ich denke, Sie werden nur erfundene Umstände finden, die Probleme verursachen, wie zwei Datensätze, die
Der erste Fall sollte niemals passieren. Letzteres könnte gelöst werden durch record B mit einem Feld von record A .
Sie brauchen nur ein Feld, damit die beiden unterscheidbar sind. Ansonsten können die Definitionen gleich sein.
%Vor%Die Mustererkennung ist auch ziemlich flexibel, da Sie nur genügend Felder zuordnen müssen, um sie von anderen Typen zu unterscheiden.
%Vor%Übrigens, Ihr Szenario lässt sich leicht mit einer Typ-Anmerkung fixieren:
%Vor%Damit Sie wissen, was F # bietet, möchte ich nur erwähnen, dass es in OCaml keinen vollqualifizierten Accessor für Datensätze gibt. Um zwischen Datensatztypen mit denselben Feldern unterscheiden zu können, müssen Sie diese daher in Submodule einfügen und mit Modulpräfixen referenzieren.
Ihre Situation in F # ist also viel besser. Jede Unklarheit zwischen ähnlichen Datensatztypen könnte schnell mit dem Record Accessor gelöst werden:
%Vor%Außerdem ist F # record überhaupt nicht beschränkt. Es bietet eine Vielzahl an nützlichen Funktionen, einschließlich Mustererkennung, Standard-Unveränderbarkeit, strukturelle Gleichheit, etc.
Tags und Links f# pattern-matching record