Shared Fälle in F # diskriminierten Gewerkschaften

Ich möchte so etwas schreiben:

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 zwischenNumExp undExp imgetValue. Auch das Folgende schlägt fehl:

let getValue (nn : NumExp) = match nn with | Num(n) -> n

ibt es eine Möglichkeit, in beiden diskriminierten Gewerkschaften den gleichen Fall zu verwenden, der mit Funktionen arbeite Die DU-Definitionen selbst sind in Ordnung.

Ich möchte den gleichen Fall verwenden, um das Hinzufügen einer Indirektionsebene wie @ zu vermeide

type Exp =
    | NumExpExp of NumExp
    | Dot of NumExp * NumExp
    | Op of string * Exp * Exp

in demExp definition. Ich habe das Gefühl, hier fehlt mir etwas sehr Grundlegendes.

Der Grund, warum ichNumExp ist, dass ich in der Lage sein möchte, 2 @ 'steckenExps in einDot (statt 2 Floats), weil es das Generieren von Ausdrücken erleichtert, aber es kann kein @ seExp, nur numerisch.

BEARBEITE: Was ich wirklich wissen wollte, ist, ob die beiden Fälle in den beiden DUs als dieselbe Entität behandelt werden könnten (Art wieExp "einschließlich"NumExp). Ich merke jetztExp.Num undNumExp.Num sind völlig getrennte Einheiten. Tomas bietet eine gute Möglichkeit, die beiden folgenden Fälle zu unterscheiden.

Antworten auf die Frage(8)

Ihre Antwort auf die Frage