2012-04-04 7 views
7

मैं हाल ही में unsafePerformIO पढ़ रहा हूं, और मैं आपको कुछ पूछना चाहता हूं। मैं इस तथ्य के साथ ठीक हूं कि एक असली भाषा बाहरी पर्यावरण से बातचीत करने में सक्षम होना चाहिए, इसलिए unsafePerformIO कुछ हद तक उचित है।कैसे पता चलेगा कि स्पष्ट रूप से शुद्ध हास्केल इंटरफ़ेस असुरक्षित संचालन को छुपाता है?

हालांकि, मेरे सबसे अच्छे ज्ञान पर, मुझे यह जानने के लिए किसी भी त्वरित तरीके से अवगत नहीं है कि क्या स्पष्ट रूप से शुद्ध (प्रकारों से निर्णय) इंटरफ़ेस/लाइब्रेरी वास्तव में unsafePerformIO पर कॉल की खोज में कोड का निरीक्षण किए बिना शुद्ध है (दस्तावेज इसका उल्लेख करने के लिए छोड़ सकता है)। मुझे पता है कि यह केवल तभी उपयोग किया जाना चाहिए जब आप सुनिश्चित हों कि पारदर्शी पारदर्शिता की गारंटी है, लेकिन मैं इसके बारे में जानना चाहता हूं।

+3

"मुझे पता है कि यह केवल तभी उपयोग किया जाना चाहिए जब आप सुनिश्चित हों कि संदर्भित पारदर्शिता की गारंटी है" बिल्कुल। केवल तभी उपयोग किया जाना चाहिए जब आंतरिक संचालन किसी भी उचित तरीके से बाहरी रूप से बाहर नहीं जा सकें, यानी जब कोई ऐसा तरीका न हो कि हुड के नीचे ऐसी कोई चीजें चल रही हों। – leftaroundabout

+1

वैसे, बाहरी वातावरण के साथ बातचीत करने के लिए 'unsafePerformIO' का उपयोग करना ठीक वही है जो आपको * करने की अनुमति नहीं है *। सभी प्रभाव आपके कोड के लिए आंतरिक होने चाहिए - यादों को लागू करने के लिए दृश्यों के पीछे एक परिवर्तनीय चर का उपयोग करना। – ehird

+0

@ehird: आगे स्पष्टीकरण के लिए धन्यवाद, लेकिन जब मैंने "पर्यावरण" लिखा, तो मेरा मतलब यह व्यापक संभव अर्थ में था, जिसमें बाहरी (गैर-हैकेल) पुस्तकालय भी शामिल थे। मैंने उपयोगकर्ता बातचीत के बारे में नहीं सोचा था। –

उत्तर

10

स्रोत कोड की जांच किए बिना कोई रास्ता नहीं है। लेकिन यह बहुत मुश्किल नहीं है, क्योंकि हैडॉक दस्तावेज में सिंटैक्स-हाइलाइट की गई परिभाषाओं के लिए सीधे एक अच्छा लिंक देता है। उदाहरण के लिए this page पर परिभाषाओं के दाईं ओर "स्रोत" लिंक देखें।

Safe Haskell यहां प्रासंगिक है; इसका उपयोग उन परिस्थितियों में हास्केल कोड को संकलित करने के लिए किया जाता है जहां आप असुरक्षित कार्यक्षमता के उपयोग को अस्वीकार करना चाहते हैं। यदि कोई मॉड्यूल एक असुरक्षित मॉड्यूल (जैसे System.IO.Unsafe) का उपयोग करता है और इसे विशेष रूप से Trustworthy के रूप में चिह्नित नहीं किया गया है, तो यह इसकी असुरक्षित स्थिति का वारिस करेगा। लेकिन unsafePerformIO का उपयोग करने वाले मॉड्यूल आम तौर पर इसे सुरक्षित रूप से उपयोग करेंगे, और इस प्रकार खुद को Trustworthy घोषित करेंगे।

+0

धन्यवाद, तो जैसा मैंने सोचा था ... स्रोत कोड या कुछ भी नहीं। कम से कम, हालांकि प्रोग्रामर द्वारा फिर से गारंटी दी जाती है, सुरक्षित हास्केल स्वचालित रूप से कुछ असुरक्षित मॉड्यूल की पहचान करने में मदद कर सकता है। –

5

यदि आप सोच रहे हैं, तो unsafePerformIO का उपयोग अन्यायपूर्ण है। documentation for unsafePerformIO यह बताता है: यह केवल उन मामलों के लिए है जहां कार्यान्वयनकर्ता साबित कर सकता है कि संदर्भित पारदर्शिता, यानी "पूरी तरह कार्यात्मक" अर्थशास्त्र को तोड़ने का कोई तरीका नहीं है। यानी, अगर कोई unsafePerformIO का उपयोग इस तरह से करता है कि एक पूर्ण रूप से कार्यात्मक प्रोग्राम इसका पता लगा सकता है (उदाहरण के लिए, एक फ़ंक्शन लिखें जिसका परिणाम केवल इसके तर्कों से अधिक निर्भर करता है), तो यह एक अस्वीकृत उपयोग है।

यदि आप इस तरह के मामले में भाग गए हैं, तो सबसे अधिक संभावना है कि आपको एक बग मिला है।

+2

प्रश्न से: "मुझे पता है कि यह केवल तभी उपयोग किया जाना चाहिए जब आप सुनिश्चित हों कि पारदर्शी पारदर्शिता की गारंटी है, लेकिन मैं इसके बारे में जानना चाहूंगा।" – ehird

+0

@ सैकुंडियम: आप सही हैं, मैंने पहले से ही 'unsafePerformIO' के लिए प्रलेखन पृष्ठ देखा है, लेकिन यह केवल एक नियम है, और मुझे संभवतः यह सुनिश्चित नहीं किया जा सकता है कि प्रोग्रामर वास्तव में संदर्भित पारदर्शिता के लिए सबूत है :) –

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