2012-04-24 9 views
24

मैंने देखा कि Data.UnionFind IORefs के माध्यम से पॉइंटर्स प्रदान करने के लिए आईओ मोनैड का उपयोग करता है। मुझे लगता है कि हर किसी को शुद्ध कोड में स्थानीय रूप से इसका उपयोग करते समय unsafePerformIO खुशी से कॉल करता है, क्योंकि डेटा संरचना इतनी अच्छी तरह से समझी जाती है, लेकिन ..शुद्ध कोड में आईओआरएफ से बचें

क्या ऐसे डेटा संरचनाओं के लिए एक कैननिकल क्लीनर दृष्टिकोण है? शायद आईओ के चारों ओर एक रैपर जो अनिवार्य बनाता है unsafePerformIO अधिकांश आईओ संचालन को प्रतिबंधित करके कम असुरक्षित "दिख रहा है"?

+0

मेरा मानना ​​है कि पैकेज आईओ मोनैड के अंदर उपयोग किया जाना है। अधिकांश हास्केलर्स जितना संभव हो सके 'असुरक्षितफॉर्मियो' से दूर रहते हैं। –

उत्तर

30

क्या ऐसे डेटा संरचनाओं के लिए एक कैननिकल क्लीनर दृष्टिकोण है? शायद आईओ के चारों ओर एक रैपर जो अपरिहार्य असुरक्षित बनाता है, अधिकांश आईओ ऑपरेशंस को प्रतिबंधित करके कम असुरक्षित "दिख रहा है"?

हाँ, ठीक है। आपने अभी कुछ 0 साल पहले Launchbury and Peyton Jones द्वारा पेश की गई the ST monad का आविष्कार किया है।

ST मोनैड केवल स्थानीय स्तर पर स्मृति प्रभावों की अनुमति देता है। यह उल्लेखनीय है कि यह टाइप सिस्टम का उपयोग यह गारंटी देने के लिए करता है कि साइड इफेक्ट्स उन कोड ब्लॉक के दायरे के बाहर दिखाई नहीं दे रहे हैं जो उनका उपयोग कर रहे हैं।

तो, जब तक आप केवल संदर्भ के माध्यम से स्मृति का उपयोग करते हैं, केवल स्थानीय दायरे में, आप unsafePerformIO से बच सकते हैं और इसके बजाय शुद्ध एसटी का उपयोग कर सकते हैं, उदाहरण के लिए, implement union-find पर।

+0

आह, मुझे एहसास नहीं हुआ था कि एसटी के आंतरिक संदर्भ थे, धन्यवाद। –

+0

उपर्युक्त '' 'एसटी मोनड'' लिंक टूटा हुआ है। यहां एक वर्तमान है: http://hackage.haskell.org/package/base-4.9.1.0/docs/Control-Monad-ST.html –

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