2009-11-11 8 views
9

क्या हास्केल में पॉइंटर गुणवत्ता की कोई धारणा है? == को ईक प्राप्त करने की आवश्यकता होती है, और मेरे पास कुछ ऐसा है जिसमें एक (वैल्यू -> आईओ वैल्यू) है, और न तो - और न ही आईओ प्राप्त होता है।हास्केल में पॉइंटर समानता?

संपादित करें: मैं किसी अन्य भाषा जो करता सूचक समानता है के लिए एक अनुवादक बना रहा हूं, इसलिए मैं इस व्यवहार मॉडल करने के लिए, जबकि अभी भी हास्केल कार्यों का उपयोग करने के लिए बंद मॉडल करने के लिए सक्षम किया जा रहा कोशिश कर रहा हूँ।

संपादित करें: उदाहरण:

> let x a = a * 2 
> let y = x 
> special x y 
True 
> let z a = a * 2 
> special x z 
False 

उत्तर

10

संपादित करें: अपना उदाहरण देखते हुए, आप इसे आईओ मोनैड के साथ मॉडल कर सकते हैं। बस अपने कार्यों को IORefs पर असाइन करें और उनकी तुलना करें।

Prelude Data.IORef> z <- newIORef (\x -> x) 
Prelude Data.IORef> y <- newIORef (\x -> x) 
Prelude Data.IORef> z == z 
True 
Prelude Data.IORef> z == y 
False 
+0

मैं सिर्फ यह देखना चाहता हूं कि मुझे प्राप्त होने वाले दो कार्य वास्तव में एक ही कार्य हैं या नहीं। मैं एक और भाषा के लिए एक दुभाषिया बनाने की कोशिश कर रहा हूं जिसमें पॉइंटर समानता है, और मैं इस व्यवहार की नकल करना चाहता हूं। – Claudiu

+2

लेकिन "समान कार्य" का क्या अर्थ है? (\ x -> x) एक ही कार्य है (\ x -> x)। वही कार्य ((\ x y -> y) x), आदि। मुझे लगता है कि आपको अपनी व्याख्या की गई भाषा में किसी फ़ंक्शन के "पता" को ट्रैक करने के लिए एक अतिरिक्त डेटाम है। एक मोनैड जो मॉडलों को एक -> (इंट, ए) कोयलेब्रा क्रम में हो सकता है। – Apocalisp

+1

अफसोस की बात है कि हमारे पास मामला बुराई = आईडी {unId = const undefined} भी है, इसलिए आपका उदाहरण 100% सत्य नहीं है। उन अजीब बोतलें। :) – Tirpen

3

IORefs निकाले जाते हैं Eq: मैं एक समारोह special कि इस करना होगा चाहते हैं। मुझे समझ में नहीं आता कि पॉइंटर समानता प्राप्त करने के लिए आपको और क्या चाहिए।

संपादित करें: पॉइंटर समानता की तुलना करने के लिए यह समझ में आता है कि एकमात्र चीजें परिवर्तनीय संरचनाएं हैं। लेकिन जैसा कि मैंने उपर्युक्त उल्लेख किया है, IORefs जैसे म्यूटेबल स्ट्रक्चर, पहले से ही उदाहरण ईक है, जो आपको यह देखने की अनुमति देता है कि दो आईओआरआईफ़ एक ही संरचना हैं, जो बिल्कुल सूचक बराबर है।

+0

क्षमा करें, मैंने अपना प्रश्न तय कर दिया है। आईओ ईक नहीं प्राप्त करता है, और न ही कार्य करता है। मैं यह जांचना चाहता हूं कि दो कार्य एक ही कार्य होते हैं या नहीं। – Claudiu

+0

लेकिन आईओएस "पॉइंटर्स" नहीं हैं। मैं नहीं देखता कि उनकी तुलना करने का क्या अर्थ होगा। क्या आप एक उदाहरण दे सकते हैं? – newacct

+0

आप दो कार्यों की तुलना नहीं कर सकते हैं यह देखने के लिए कि वे एक जैसे हैं या नहीं। उदाहरण के लिए मैं "foo x = 2 * x" और "बार x = x + x" लिख सकता हूं। स्पष्ट रूप से foo और bar बराबर हैं क्योंकि सभी x, foo x == बार x के लिए, लेकिन सामान्य मामले में यह अपरिहार्य है। मुझे पता है कि आप जो चाहते थे वह काफी नहीं है; आप एक "अलग-अलग कार्य हो सकते हैं" तुलना चाहते हैं। लेकिन नहीं, हास्केल के पास यह नहीं है। –

8

पॉइंटर समानता referential transparency तोड़ जाएगी, इसलिए नहीं।

शायद आश्चर्य की बात है, यह वास्तव possiblecompact spaces पर कुल कार्यों का extensional equality गणना करने के लिए है, लेकिन सामान्य रूप में (संभव गैर समाप्ति के साथ पूर्णांकों पर जैसे कार्यों) इस असंभव है।


संपादित करें: मैं एक और

भाषा तुम सिर्फ मूल कार्यक्रम एएसटी या स्रोत स्थान हास्केल कार्यों आप उन्हें में अनुवाद किया गया है के साथ रख सकते के लिए एक अनुवादक बना रहा हूं? ऐसा लगता है कि आप उस पर आधारित "समानता" चाहते हैं।

+3

देखें मुझे पूरा यकीन है कि वाक्यांश 'विस्तारित समानता' और 'कॉम्पैक्ट टोपोलॉजी' सामान्य शब्दकोष में नहीं हैं। – yfeldblum

+1

वाक्यांश 'विस्तारित समानता' और 'कॉम्पैक्ट टोपोलॉजी' वाक्यांश हैं जो मुझे हैकेल –

+0

दिलचस्प लिंक का प्रयास करने से रोकते हैं। मेरा पहला विचार था "यह आदमी बकवास बात कर रहा है।" लेकिन हम सामान्य कार्यों के बारे में बात नहीं कर रहे हैं, हम _computable_ कार्यों के बारे में बात कर रहे हैं। उसी से सारा फर्क पड़ता है। – Thomas

5

== Eq

पाने किए जाने की

असल (==) समीकरण का एक उदाहरण की आवश्यकता है, जरूरी नहीं कि एक व्युत्पन्न उदाहरण चीजों की आवश्यकता है। आपको शायद ऐसा करने की आवश्यकता है जो ईक का अपना उदाहरण प्रदान करे जो (Value -> IO Value) भाग को अनदेखा करता है। उदा।,

data D = D Int Bool (Value -> IO Value) 

instance Eq D where 
    D x y _ == D x' y' _ = x==x && y==y' 

क्या इससे मदद मिलती है?

+1

I द्वारा आईडी निर्दिष्ट करें I लगता है कि आपका मतलब है 'x == x''? – mipadi

+0

यह करता है, और मैंने अब यह किया है – Claudiu

+1

हां, 'x == x'' मेरा मतलब है। –

3

मैं अन्य भाषा जो सूचक समानता है के लिए एक अनुवादक बना रहा हूं, इसलिए, जबकि अभी भी हास्केल कार्यों का उपयोग करने के लिए बंद मॉडल करने के लिए सक्षम किया जा रहा मैं इस व्यवहार मॉडल के लिए कोशिश कर रहा हूँ।

मुझे पूरा यकीन है कि ऐसे दुभाषिया को लिखने के लिए, आपका कोड monadic होना चाहिए। क्या आपको किसी प्रकार का पर्यावरण या राज्य बनाए रखना नहीं है? यदि ऐसा है, तो आप फ़ंक्शन क्लोजर के लिए काउंटर भी बनाए रख सकते हैं। इस प्रकार, जब भी आप एक नया बंद करते हैं तो आप इसे एक अद्वितीय आईडी से लैस करते हैं। फिर सूचक समकक्ष के लिए आप बस इन पहचानकर्ताओं की तुलना करें।

3

ऐसा करने का एक और तरीका StableNames का फायदा उठाना है।

हालांकि, विशेष रूप से आईओ मोनैड के अंदर अपने परिणामों को वापस करना होगा जबतक कि आप असुरक्षित पैराफॉर्मियो का दुरुपयोग नहीं करना चाहते हैं।

आईओआरएफ समाधान को आपकी संरचना के निर्माण में आईओ की आवश्यकता है। जब आप रेफरेंशियल समानता की जांच करना चाहते हैं तो StableNames की जांच केवल तभी होती है।

+1

फ़ंक्शन समानता की जांच करने के लिए यह एक बहुत अच्छा समाधान है, भले ही 'स्टेबलनाम' हमेशा समतुल्य रूप से समतुल्य न हो, जब यह सहजता से लगता है कि वे हो सकते हैं। बस दस्तावेज़ों में एक लिंक जोड़ना चाहता था: http://hackage.haskell.org/package/base-4.7.0.2/docs/System-Mem-StableName.html –

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