2010-04-21 6 views
5

एफ # में, समानता ऑपरेटर (=) आमतौर पर आकस्मिक के बजाय विस्तारित है। एक दम बढ़िया! दुर्भाग्यवश, ऐसा लगता है कि एफ # इन विस्तारित तुलनाओं को कम करने के लिए सूचक समानता का उपयोग नहीं करता है।एफ # में शॉर्ट-कटिंग समानता जांच?

उदाहरण के लिए, इस कोड:

 
type Z = MT | NMT of Z ref 

// create a Z: 
let a = ref MT 
// make it point to itself: 
a := NMT a 

// check to see whether it's equal to itself: 
printf "a = a: %A\n" (a = a) 

... मेरे एक बड़ा वसा विभाजन गलती देता है [*], इस तथ्य के बावजूद है कि 'एक' और 'एक' दोनों एक ही संदर्भ के लिए मूल्यांकन करते हैं। यह इतना अच्छा नहीं है। अन्य कार्यात्मक भाषाओं (उदाहरण के लिए पीएलटी योजना) पॉइंटर तुलना का उपयोग करके, सही होने पर 'सही' वापस करने के लिए, पॉइंटर तुलना का उपयोग करके निर्धारित किया जा सकता है।

तो: मैं इस तथ्य को स्वीकार करूंगा कि एफ # की समानता ऑपरेटर शॉर्ट-काटने का उपयोग नहीं करता है; क्या एक इंटेंशनल (पॉइंटर-आधारित) समानता जांच करने का कोई तरीका है? (==) ऑपरेटर को मेरे प्रकारों पर परिभाषित नहीं किया गया है, और अगर कोई मुझे बता सकता है कि यह किसी भी तरह उपलब्ध है तो मुझे यह अच्छा लगेगा।

या मुझे बताया कि मैं इस स्थिति के अपने विश्लेषण में गलत हूँ: मैं अच्छा लगेगा कि, भी ...

[*] यही कारण है कि शायद विंडोज पर एक ढेर अतिप्रवाह हो सकता है; मोनो के बारे में चीजें हैं कि मैं उस शौकीन नहीं हूं ...

उत्तर

7

दो विकल्प हैं जिन्हें मैं जानता हूं। मानक .NET दृष्टिकोण System.Object.ReferenceEquals का उपयोग करना होगा। एफ # में थोड़ा बेहतर दृष्टिकोण LanguagePrimitives.PhysicalEquality का उपयोग करना हो सकता है जो मूल रूप से समान है, लेकिन केवल संदर्भ प्रकारों पर काम करता है (जो आपके उद्देश्यों के लिए शायद सही है) और दोनों तर्कों को एक ही स्थिर प्रकार के लिए आवश्यक है। यदि आप निसर सिंटैक्स चाहते हैं तो आप इन कार्यों में से किसी एक के संदर्भ में अपनी पसंद के कस्टम ऑपरेटर को भी परिभाषित कर सकते हैं।

एक तरफ, .NET पर मुझे एक अनंत लूप मिलता है लेकिन जब मैं अपना कोड चलाता हूं तो संभवतः पूंछ कॉल अनुकूलन के कारण एक स्टैक ओवरफ़्लो नहीं होता है।

+0

धन्यवाद! एक तरफ के रूप में: हाँ, यह वास्तव में मोनो/ओएसएक्स पर कोर डंप करता है। संभवत: पूंछ-कॉलिंग का उपयोग मोनो/fsharp के विशेष संयोजन में समानता जांच के लिए उचित रूप से लागू नहीं किया गया है जिसका मैं उपयोग कर रहा हूं। –