2012-04-12 13 views
6

मैं अपने सिर को भेदभाव वाले संघों और रिकॉर्ड प्रकारों के आसपास लाने की कोशिश कर रहा हूं; विशेष रूप से अधिकतम पठनीयता के लिए उन्हें कैसे गठबंधन करना है। यहां एक उदाहरण दिया गया है - कहें कि एक स्पोर्ट्स टीम के पास अंक (दोनों लीग पॉइंट्स और लक्ष्य अंतर) हो सकते हैं, या इसे लीग से निलंबित किया जा सकता है, जिस स्थिति में उसके पास कोई अंक या लक्ष्य अंतर नहीं है। यहां बताया गया है कि मैंने इसे व्यक्त करने का प्रयास कैसे किया:रिकॉर्ड प्रकारों के साथ भेदभाव वाले संघों का संयोजन

type Points = { LeaguePoints : int; GoalDifference : int } 

type TeamState = 
    | CurrentPoints of Points 
    | Suspended 

type Team = { Name : string; State : TeamState } 

let points = { LeaguePoints = 20; GoalDifference = 3 } 

let portsmouth = { Name = "Portsmouth"; State = points } 

समस्या अंतिम पंक्ति के अंत में आती है, जहां मैं 'राज्य = अंक' कहता हूं। मुझे लगता है कि अभिव्यक्ति से टीमस्टेट टाइप करने की उम्मीद थी, लेकिन यहां टाइप पॉइंट्स हैं। मैं उसके आसपास कैसे हो सकता हूं?

उत्तर

5
let portsmouth = { Name = "Portsmouth"; State = CurrentPoints points } 
+0

आप सुंदरता! धन्यवाद पैड – Kit

+0

(अनुमति के समय उत्तर के रूप में चिह्नित होगा - 6 मिनट!) – Kit

15

कारण पैड का जवाब देने के लिए कुछ जानकारी जोड़ने के लिए, क्यों अपने प्रारंभिक संस्करण काम नहीं किया है कि मूल्य के प्रकार State करने के लिए सौंपा प्रकार TeamState के साथ भेदभाव संघ मूल्य होना चाहिए। अपने एक्सप्रेशन में:

let portsmouth = { Name = "Portsmouth"; State = points } 

... points के प्रकार Points है। पैड द्वारा पोस्ट किए गए संस्करण में, अभिव्यक्ति CurrentPoints points के एक निर्माता का उपयोग CurrentPoints का प्रतिनिधित्व करने वाले भेदभाव वाले यूनियन मान बनाने के लिए करती है। दूसरा विकल्प यह है कि संघ आप Suspended है देता है, जो इस तरह इस्तेमाल किया जा सकता:

let portsmouth = { Name = "Portsmouth"; State = CurrentPoints points } 
let portsmouth = { Name = "Portsmouth"; State = Suspended } 

यदि आप निर्माता के नाम का उपयोग नहीं किया है, तो यह स्पष्ट नहीं है कि कैसे आप एक निलंबित टीम का निर्माण चाहते हैं!

अंत में, आप भी सिर्फ एक ही लाइन पर सब कुछ लिख सकते हैं, लेकिन यह है कि के रूप में पढ़ने योग्य नहीं है:

let portsmouth = 
    { Name = "Portsmouth" 
    State = CurrentPoints { LeaguePoints = 20; GoalDifference = 3 } } 
+1

विस्तार के लिए धन्यवाद Tomas :-) – Kit

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