ich so etwas schreiben wollen:Gemeinsame Fälle in F # diskriminiert Gewerkschaften
type NumExp = Num of float
type Exp =
| Num of float
| Dot of NumExp * NumExp
| Op of string * Exp * Exp
let getValue (Num(n) : NumExp) = n
Der Compiler beschwert sich über einen Konflikt zwischen NumExp
und Exp
in getValue
. Auch die folgenden fehlschlägt:
let getValue (nn : NumExp) = match nn with | Num(n) -> n
Gibt es eine Möglichkeit, den gleichen Fall in beiden diskriminiert Gewerkschaften zu verwenden, die mit Funktionen arbeitet? Die DU-Definitionen selbst sind in Ordnung.
Ich möchte den gleichen Fall verwenden, um eine Dereferenzierungsebene wie
type Exp =
| NumExpExp of NumExp
| Dot of NumExp * NumExp
| Op of string * Exp * Exp
in der Exp
Definition zu vermeiden hinzufügen. Ich fühle mich hier etwas sehr Grundlegendes vermisst.
Der Grund, warum ich NumExp
habe ist, dass ich zu ‚plug‘ 2 Exp
s in eine Dot
(statt 2 Schwimmer) in der Lage sein wollen, weil es Ausdrücke einfacher Generierung macht, aber sie können nicht Exp
, nur numerisch sein .
EDIT: was ich wollte wirklich wissen, ist, ob die beiden Fälle in den beiden DUs als die gleiche Einheit behandelt werden (Art wie Exp
„einschließlich“ NumExp
). Ich realisiere jetzt Exp.Num
und NumExp.Num
sind völlig separate Einheiten. Tomas bietet eine gute Möglichkeit, die beiden folgenden Fälle zu unterscheiden.
Dank Tomas, die Disambiguierung wirkt Wunder. Was ich jedoch fragte, war mehr wie "Können die beiden Fälle in den beiden DUs als dieselbe Entität behandelt werden?", Oder mit anderen Worten, "Can Exp" kann "NumExp?" Enthalten. Aber von deiner Antwort ist die Antwort nein. Vielen Dank! – Mau
@Mau: Ich habe einige Informationen über die Aufteilung der Fälle zwischen verschiedenen diskriminierten Gewerkschaften hinzugefügt. Es ist nicht möglich, aber Sie können eine in die andere einschließen. –
danke, genau das habe ich gemacht :-) – Mau