Os sindicatos discriminados podem referir-se uns aos outros?
-
27-09-2020 - |
Pergunta
Estou construindo uma árvore de expressão usando uniões discriminadas.O código abaixo:
type IntExpression =
| TrueIsOne of BoolExpression
type BoolExpression =
| LessThan of IntExpression * IntExpression
| And of BoolExpression * BoolExpression
| Or of BoolExpression * BoolExpression
| Bool of bool
gera um erro porque BoolExpression não está definido.Trocar as definições resulta apenas no inverso (IntExpression não está definido) como seria de esperar.
Existe uma maneira de contornar isso?
Solução
Sim, use and
para agrupar definições de tipo com interdependências:
type IntExpression =
| TrueIsOne of BoolExpression
and BoolExpression =
| LessThan of IntExpression * IntExpression
| And of BoolExpression * BoolExpression
| Or of BoolExpression * BoolExpression
| Bool of bool
Outras dicas
"e" geralmente funciona para tipos com dependências mútuas.Ou seja, funciona para todos os tipos, como uniões discriminadas, conforme mostrado por Mau, classes, registros e funções mutuamente recursivas.
Exemplo sem terminação:
let rec foo x = bar x
and bar x = foo x
Talvez isso funcione:
type IntExpression =
...
and BoolExpression =
...
(Informações retiradas de esta página no MSDN.)
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow