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' 2Exp
s 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.