Casos compartidos en sindicatos discriminados F #
Quiero escribir algo como esto:
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
El compilador se queja de un conflicto entreNumExp
yExp
engetValue
. Incluso lo siguiente falla:
let getValue (nn : NumExp) = match nn with | Num(n) -> n
¿Hay alguna manera de usar el mismo caso en ambos sindicatos discriminados que funcionan con funciones? Las definiciones de DU están bien.
Quiero usar el mismo caso para evitar agregar un nivel de indirección como
type Exp =
| NumExpExp of NumExp
| Dot of NumExp * NumExp
| Op of string * Exp * Exp
en elExp
definición. Siento que me falta algo muy básico aquí.
La razón por la que tengoNumExp
es que quiero poder 'enchufar' 2Exp
s en unDot
(en lugar de 2 flotantes) porque facilita la generación de expresiones, pero no pueden ser ningunaExp
, solo numérico.
EDITAR: lo que realmente quería saber es si los dos casos en los dos DU podrían tratarse como la misma entidad (algo así comoExp
"incluso"NumExp
) Me doy cuenta ahoraExp.Num
yNumExp.Num
son entidades completamente separadas. Tomás proporciona una buena manera de discriminar los dos casos a continuación.