2012-12-07 14 views
17

आमतौर पर, F # पैटर्न पैटर्न को एक ही पैटर्न में दो बार होने की अनुमति नहीं देता है। लेकिन निम्नलिखित कोड में, एफ # शिकायत नहीं करता है - क्या यह एक बग है?एक चर पैटर्न में दो बार बाध्य क्यों हो सकता है?

type foo = { A: int } 
let test (x, {A = x}) = x 
let result = test ("bla", {A = 3}) 
+2

सरल उदाहरण - 'परीक्षण (x, (x, y)) = 1' –

+3

सुनिश्चित नहीं है कि इस प्रश्न को डाउनवोट क्यों मिला - यह मेरे लिए एक दिलचस्प समस्या की तरह दिखता है! मुझे लगता है कि यह एक बग है और आप _microsoft_ dot _com_ पर _fsbugs_ पर ईमेल भेजकर इसकी रिपोर्ट कर सकते हैं। –

+0

यह सुनिश्चित नहीं है कि यह एक बग है - यह तर्कसंगत रूप से निम्नतम परिभाषित एक्स को बाध्यकारी द्वारा स्कॉइंग नियमों का पालन करने के बाद तर्कसंगत है। – plinth

उत्तर

5

मुझे नहीं लगता कि यह एक बग है, हालांकि यह भ्रमित लगता है, लेकिन यह संकलक उपरोक्त मूल्य बाध्यकारी को संकलित करता है।

धारा 14.6.3 कहा गया है कि यदि मान परिभाषा एकल मान पैटर्न (मामले यहाँ है के रूप में) नहीं है, सविस्तार अभिव्यक्ति

tmp <typars1… typarsn> = expr 
ident1 <typars1> = expr1 
… 
identn <typarsn> = exprn 

जहां tmp एक ताजा पहचानकर्ता और से प्रत्येक expri परिणाम है इनपुट टीएमपी के खिलाफ पैटर्न पेट (§7) का संकलन [spec से]।

क्या संकलक करता है देखने के लिए, हम एक एफ # उद्धरण, जैसे इस्तेमाल कर सकते हैं:

Let (test, 
    Lambda (tupledArg, 
      Let (x, TupleGet (tupledArg, 0), 
        Let (_arg1, TupleGet (tupledArg, 1), 
         Let (x, PropertyGet (Some (_arg1), A, []), x)))), 
    Application (test, NewTuple (Value (3), NewRecord (foo, Value (5))))) 

यही वजह है कि हम है:

<@ let test (x:int, {A = x:int})= x in test (3, {A = 5}) @>;; 

स्ट्रिंग प्रारूप में मैं (कुछ सामान बाहर छोड़कर) हो "आंतरिक" एक्स प्राप्त करें।

मुझे नहीं लगता कि यह एक बग है लेकिन शायद यह अधिक संगत होगा यदि यह चेतावनी उत्पन्न करेगा।

+0

क्या ऐसा इसलिए है क्योंकि F # में मूल्यवान मूल्यों की अनुमति है? – Goswin