2010-07-22 11 views
14

Buduję drzewo ekspresji używając dyskryminowanych związków. Poniższy kod:Czy dyskryminowane związki odnoszą się do siebie nawzajem?

type IntExpression = 
    | TrueIsOne of BoolExpression 

type BoolExpression = 
    | LessThan of IntExpression * IntExpression 
    | And of BoolExpression * BoolExpression 
    | Or of BoolExpression * BoolExpression 
    | Bool of bool 

Zgłasza błąd, ponieważ BoolExpression nie jest zdefiniowany. Zamiana definicji powoduje tylko odwrotny (IntExpression nie jest zdefiniowany), jak można się spodziewać.

Czy istnieje sposób obejścia tego?

+0

możliwe duplikat [zgłoszeń # Typ przodu f] (http://stackoverflow.com/questions/1378575/f-forward-type-declarations) – Brian

+0

@Brian To to samo pytanie, ale terminologia jest na tyle inna, że ​​nie udało mi się go znaleźć ani w Google, ani w wyszukiwaniu strony. Już samo to może być powodem, aby zostawić obie otwarte. – mavnn

Odpowiedz

23

Tak, użyj and do grupy definicji typu z wzajemnych zależności:

type IntExpression = 
    | TrueIsOne of BoolExpression 

and BoolExpression = 
    | LessThan of IntExpression * IntExpression 
    | And of BoolExpression * BoolExpression 
    | Or of BoolExpression * BoolExpression 
    | Bool of bool 
4

Może to będzie działać:

type IntExpression = 
    ... 
and BoolExpression = 
    ... 

(Informacje zaczerpnięte z this page on MSDN.)

9

"i" działa ogólnie dla typów z wzajemnymi zależnościami. Oznacza to, że działa on dla wszystkich typów, takich jak dyskryminowane związki, jak pokazuje Mau, klasy, rekordy i funkcje rekurencyjne.

dla zakończenia przykład:

let rec foo x = bar x 
and bar x = foo x 
+1

+1 dla dodatkowego kontekstu –

Powiązane problemy