F # -Typ Definition mit Ausdruck

8

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.

    
fsl 30.12.2012, 10:14
quelle

4 Antworten

6

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:

%Vor%

Sie können dasselbe für andere Typen tun:

%Vor%

Verwendung derselben in einer Struktur:

%Vor%     
bytebuster 30.12.2012 20:09
quelle
3

Definieren Sie es als Unionstyp:

%Vor%

und überschreiben Sie den Konstruktor mit einer anderen Funktion:

%Vor%     
Jon Harrop 31.12.2012 16:48
quelle
2

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%     
pad 30.12.2012 17:14
quelle
1

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.

    
John Palmer 30.12.2012 10:44
quelle

Tags und Links