¿Pueden las uniones discriminadas se refieren entre sí?
-
27-09-2020 - |
Pregunta
Estoy construyendo un árbol de expresión usando sindicatos discriminados.El siguiente código:
type IntExpression =
| TrueIsOne of BoolExpression
type BoolExpression =
| LessThan of IntExpression * IntExpression
| And of BoolExpression * BoolExpression
| Or of BoolExpression * BoolExpression
| Bool of bool
lanza un error porque la boolexpression no está definida.Intercambiar las definiciones simplemente resulta en el reverso (no se define la intoxresión) como lo esperaba.
¿Hay alguna manera de evitar esto?
Solución
Sí, use and
a definiciones de tipo de grupo con las dependencias entre:
type IntExpression =
| TrueIsOne of BoolExpression
and BoolExpression =
| LessThan of IntExpression * IntExpression
| And of BoolExpression * BoolExpression
| Or of BoolExpression * BoolExpression
| Bool of bool
Otros consejos
"y" funciona generalmente para tipos con dependencias mutuas.Es decir, funciona para todos los tipos, como los sindicatos discriminados, como lo demuestra Mau, clases, registros y funciones mutuamente recursivas.
Ejemplo no terminado:
let rec foo x = bar x
and bar x = foo x
Tal vez esto funcionará:
type IntExpression =
...
and BoolExpression =
...
(información tomada de esta página en MSDN .)
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow