2010-07-22 11 views
14

Ich baue einen Ausdruck Baum mit diskriminierten Gewerkschaften. Der folgende Code:Können diskriminierte Gewerkschaften sich aufeinander beziehen?

type IntExpression = 
    | TrueIsOne of BoolExpression 

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

gibt einen Fehler aus, weil BoolExpression nicht definiert ist. Wenn Sie die Definitionen austauschen, führt dies wie erwartet zu einem umgekehrten Ergebnis (IntExpression ist nicht definiert).

Gibt es einen Weg um dies?

+0

möglich Duplikat von [F # Vorwärts-Typdeklarationen] (http://stackoverflow.com/questions/1378575/f-forward-type-declarations) – Brian

+0

@ Brian ist es, dieselbe Frage, aber die Terminologie ist so unterschiedlich, dass ich sie weder mit Google noch mit der Website-Suche gefunden habe. Das allein könnte ein Grund sein, beide offen zu lassen. – mavnn

Antwort

23

Ja, Typdefinitionen mit gegenseitigen Abhängigkeiten and zur Gruppe verwenden:

type IntExpression = 
    | TrueIsOne of BoolExpression 

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

Vielleicht wird diese Arbeit:

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

(Informationen vom this page on MSDN entnommen.)

9

"und" funktioniert in der Regel für Typen mit gegenseitigen Abhängigkeiten. Das heißt, es funktioniert für alle Typen, wie diskriminierte Vereinigungen, wie durch Mau, Klassen, Aufzeichnungen und gegenseitig rekursive Funktionen gezeigt.

Nicht beendet Beispiel:

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

+1 für den zusätzlichen Kontext –

Verwandte Themen