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 @ 'steckenExp
s 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.