योजना में, आदिम eq?
परीक्षण करता है कि क्या इसके तर्क एक ही वस्तु हैं। उदाहरण के लिए, निम्न सूचीक्या हास्केल में साझा करना कभी भी संभव है?
(define lst
(let (x (list 'a 'b))
(cons x x)))
में
(eq? (car x) (cdr x))
का परिणाम सच है, और इसके अलावा यह सच (car x)
और (cdr x)
में झाँकने के लिए बिना है। यह आपको उन डेटा संरचनाओं के लिए कुशल समानता परीक्षण लिखने की अनुमति देता है जिनमें बहुत अधिक साझाकरण होता है।
क्या हास्केल में भी वही बात संभव है? उदाहरण के लिए, निम्नलिखित बाइनरी पेड़ कार्यान्वयन
data Tree a = Tip | Bin a (Tree a) (Tree a)
left (Bin _ l _) = l
right (Bin _ _ r) = r
mkTree n :: Int -> Tree Int
mkTree 0 = Tip
mkTree n = let t = mkTree (n-1) in Bin n t t
जो प्रत्येक स्तर पर साझा कर रहा है पर विचार करें। अगर मैं let tree = mkTree 30
के साथ एक पेड़ बना देता हूं और मैं देखना चाहता हूं कि left tree
और right tree
बराबर हैं, तो मुझे यह पता लगाने के लिए एक बिलियन नोड्स पर जाना होगा कि वे एक ही पेड़ हैं, जो डेटा साझाकरण के कारण स्पष्ट होना चाहिए।
मुझे उम्मीद नहीं है कि हास्केल में डेटा साझा करने का एक आसान तरीका है, लेकिन मुझे आश्चर्य हुआ कि इस तरह के मुद्दों से निपटने के लिए सामान्य दृष्टिकोण क्या हैं, जब दक्षता उद्देश्यों के लिए साझा करना पता लगाना अच्छा होगा (या उदाहरण के लिए चक्रीय डेटा संरचनाओं का पता लगाने के लिए)।
क्या unsafe
प्राइमेटिव हैं जो साझाकरण का पता लगा सकते हैं? क्या स्पष्ट पॉइंटर्स के साथ डेटा संरचनाओं का निर्माण करने का एक प्रसिद्ध तरीका है, ताकि आप सूचक समानता की तुलना कर सकें?
यह भी देखें http://stackoverflow.com/questions/1717553/pointer-equality-in-haskell – Yuras
जब आप ऐसा करते हैं, तो हमेशा इस संभावना पर विचार करें कि आपकी डेटा संरचना में NaN या अन्य मान हैं जो बराबर की तुलना नहीं करते हैं खुद को। आपका अनुकूलन एक तोड़ने वाला हो सकता है। – rightfold