Casos compartilhados em uniões discriminadas em F #

Eu quero escrever algo como isto:

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

O compilador reclama de um conflito entreNumExp eExp nogetValue. Até o seguinte falha:

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

Existe uma maneira de usar o mesmo caso em ambas as uniões discriminadas que funciona com funções? As próprias definições de DU estão OK.

Eu quero usar o mesmo caso para evitar adicionar um nível de indireção como

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

noExp definição. Sinto que estou perdendo algo muito básico aqui.

A razão que eu tenhoNumExp é que eu quero poder 'conectar' 2Exps em umDot (em vez de 2 flutuadores) porque facilita a geração de expressões, mas elas não podem serExp, apenas numérico.

EDITAR: o que eu realmente queria saber é se os dois casos nas duas UDs podem ser tratados como a mesma entidade (tipo comoExp "Incluindo"NumExp) Eu percebo agoraExp.Num eNumExp.Num são entidades completamente separadas. Tomas fornece uma boa maneira de discriminar os dois casos abaixo.