2010-07-22 7 views
14

मैं भेदभाव वाले संघों का उपयोग कर एक अभिव्यक्ति वृक्ष का निर्माण कर रहा हूं। नीचे दिया गया कोड:यूनियनों का भेदभाव एक दूसरे से संदर्भित कर सकता है?

type IntExpression = 
    | TrueIsOne of BoolExpression 

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

त्रुटि उत्पन्न करता है क्योंकि BoolExpression परिभाषित नहीं किया गया है। परिभाषाओं को स्वैप करने के परिणामस्वरूप रिवर्स (IntExpression परिभाषित नहीं किया गया है) जैसा कि आप उम्मीद करेंगे।

क्या इसके आसपास कोई रास्ता है?

+0

संभव डुप्लिकेट (http://stackoverflow.com/questions/1378575/f-forward-type-declarations) – Brian

+0

@Brian यह है एक ही सवाल है, लेकिन शब्दावली इतना अलग है कि मैं इसे Google या साइट खोज के साथ ढूंढने में विफल रहा। वह अकेले दोनों को छोड़ने का कारण हो सकता है। अतिरिक्त संदर्भ के लिए – mavnn

उत्तर

23

हाँ, and समूह के लिए अंतर-निर्भरता के साथ प्रकार परिभाषाओं का उपयोग:

type IntExpression = 
    | TrueIsOne of BoolExpression 

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

शायद यह काम करेगा:

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

(सूचना this page on MSDN से लिया।)

9

"और" पारस्परिक निर्भरताओं वाले प्रकारों के लिए आम तौर पर काम करता है। यही है, यह माउ, कक्षाओं, अभिलेखों और पारस्परिक रूप से पुनरावर्ती कार्यों द्वारा दिखाए गए अनुसार, भेदभाव वाले संघों जैसे सभी प्रकार के लिए काम करता है।

गैर समाप्त उदाहरण:

let rec foo x = bar x 
and bar x = foo x 
[एफ # आगे प्रकार घोषणाओं] की
+1

+1 –

संबंधित मुद्दे