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' 2Exps 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.

Respuestas a la pregunta(1)

Su respuesta a la pregunta