que quiero escribir algo como esto:casos compartidos en F # discriminados sindicatos
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 entre NumExp
y Exp
en getValue
. Incluso la siguiente falla:
let getValue (nn : NumExp) = match nn with | Num(n) -> n
¿Hay una manera de utilizar el mismo caso en ambas uniones discriminadas que trabaja con funciones? Las definiciones de DU están en buen estado.
Quiero usar el mismo caso para evitar la adición de un nivel de indirección como
type Exp =
| NumExpExp of NumExp
| Dot of NumExp * NumExp
| Op of string * Exp * Exp
en la definición Exp
. Siento que me estoy perdiendo algo muy básico aquí.
La razón por la que tengo NumExp
es que quiero ser capaz de 'tapón' 2 Exp
s en un Dot
(en lugar de 2 flotadores), ya que hace más fácil la generación de expresiones, pero no puedo ser cualquier Exp
, simplemente numérica .
EDITAR: lo que realmente quería saber es si los dos casos en los dos usuarios intermedios podrían ser tratados como la misma entidad (algo así como Exp
"incluyendo" NumExp
). Me doy cuenta ahora que Exp.Num
y NumExp.Num
son entidades completamente separadas. Tomás proporciona una buena manera de discriminar los dos casos a continuación.
Gracias Tomas, la desambiguación funciona de maravilla. Sin embargo, lo que estaba preguntando era más bien '¿pueden los dos casos en los dos DU ser tratados como la misma entidad?', O en otras palabras, 'puede Exp' incluir 'NumExp?'. Pero de su respuesta, la respuesta es no. ¡Gracias! – Mau
@Mau: He añadido información sobre el intercambio de casos entre diferentes sindicatos discriminados. No es posible, pero puede incluir uno en el otro. –
gracias, eso es exactamente lo que había hecho :-) – Mau