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?

Foi útil?

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
scroll top