2012-04-24 9 views
5

क्या टुपल के बजाय अपने डेटा को एक मान पर बाध्य करके एक प्रकार को अनपैक करना संभव है?ओकैमल कन्स्ट्रक्टर अनपॅकिंग

# type foo = Foo of int * string;; 
type foo = Foo of int * string 
# Foo (3; "bar");; 
    Foo (3; "bar");; 
Error: The constructor Foo expects 2 argument(s), 
     but is applied here to 1 argument(s) 
# Foo (3, "bar");; 
- : foo = Foo (3, "bar") 

# (* Can this possibly work? *) 
# let Foo data = Foo (3, "bar");; 
    let Foo data = Foo (3, "bar");; 
Error: The constructor Foo expects 2 argument(s), 
     but is applied here to 1 argument(s) 

# (* Here is the version that I know works: *) 
# let Foo (d1, d2) = Foo (3, "bar");; 
val d1 : int = 3 
val d2 : string = "bar" 

क्या यह वाक्य रचनात्मक रूप से संभव है?

+0

संभावित डुप्लिकेट [केवल एक टुपल मान के साथ एक प्रकार प्रकार का कन्स्ट्रक्टर का उपयोग करना] (http://stackoverflow.com/questions/9774671/using-a-variant-type-constructor-with-just-one-tuple-value) – ygrek

उत्तर

9

यह ओकैमल वाक्यविन्यास का एक मुश्किल हिस्सा है। यदि आप अपने प्रकार को दिखाते समय परिभाषित करते हैं, तो इसके कन्स्ट्रक्टर Foo को दो मानों को ब्रांड्स में उम्मीद है। और यह हमेशा दो मान होना चाहिए, यह एक एकल मूल्य नहीं है जो एक ट्यूपल है।

आप एक अलग प्रकार का उपयोग करने के लिए तैयार हैं, तो आप कुछ और अधिक आप क्या चाहते हैं की तरह कर सकते हैं: जब इस तरह की घोषणा की

# type bar = Bar of (int * string);; 
type bar = Bar of (int * string) 
# let Bar data = Bar (3, "foo");; 
val data : int * string = (3, "foo") 
# let Bar (d1, d2) = Bar (3, "foo");; 
val d1 : int = 3 
val d2 : string = "foo" 

, निर्माता Bar उम्मीद एक मूल्य एक टपल है कि। यह अधिक लचीला हो सकता है, लेकिन इसे प्रस्तुत करने के लिए थोड़ा और मेमोरी भी लेती है, और भागों तक पहुंचने में थोड़ी देर लगती है।