Ist es möglich, so etwas auszudrücken:
%Vor%Ich weiß, dass es nicht möglich ist, es statisch zu machen, da dies bedeuten würde, dass F # abhängige Typen hat. In C # bin ich es gewohnt mit Codekontrakten so etwas zu tun und bekomme eine Laufzeitüberwachung. Ich suche nach etwas ähnlichem hier.
Danke
BEARBEITEN: Danke für alle Antworten, die verschiedene Vor- und Nachteile haben. Im Moment verwende ich nur eine kleine Teilmenge von F #, eine Teilmenge des OCAML-Kerns, die sich leicht zur Programmierung von Proofs eignet. Also keine Klassen.
Im Gegensatz zu dem, was andere gesagt haben, würde ich vorschlagen, hier keine Klassen zu verwenden , wenn ich Ihr Problem richtig verstanden habe.
Da der Wert unveränderlich ist, müssen wir Constraint nur einmal anwenden. Jede Wrapper-Klasse wäre ein Overhead- und Load-GC. Stattdessen erledigt eine einfache Funktion die Aufgabe:
Sie können dasselbe für andere Typen tun:
%Vor%Verwendung derselben in einer Struktur:
%Vor%Definieren Sie es als Unionstyp:
%Vor%und überschreiben Sie den Konstruktor mit einer anderen Funktion:
%Vor%In F # müssen Sie auf Klassen zurückgreifen und Argumente innerhalb von Konstruktoren prüfen. Andere Typen wie diskriminierte Vereinigungen, Datensätze und Strukturen haben implizite Konstruktoren, die Sie nicht einfach ändern können.
%Vor%Mustervergleich funktioniert nicht gut mit Klassen. Sie können das Problem mit aktiven Mustern beheben:
%Vor%Sie könnten eine generische Klasse wie folgt erstellen:
%Vor%dann können Sie es mit
verwenden %Vor% mit .set
überprüft die Bedingung erneut.
Tags und Links f#