2012-10-16 13 views
8

का उपयोग कर अधिकांश कोड लिखना ठीक है, मैं हास्केल का उपयोग कर चैट सर्वर विकसित करने की कोशिश कर रहा हूं।आईओ monads

की तरह उपयोगी उपकरणों का एक बहुत कुछ कर रहे हैं TChan, TSkiplist, forkIO ... आदि, लेकिन यह पता चला है कि मेरे कोड के सबसे आईओ monads और unsafePerformIO है, जो बहुत अक्षम लगता है अंदर लिखा है।

क्या यह करना ठीक है, या इस उद्देश्य के लिए सही उपकरण नहीं है?

+1

[हल्क] (http://chrisdone.com/posts/2011-01-30-hulk-haskell-irc-server.html) पर एक नज़र डालें - एक हास्केल में एक आईआरसी सर्वर लिखना शुरू करें। – ErikR

उत्तर

19

एक सामान्य नियम के रूप में, पहले कोड को केवल चिंता के बिना शुद्ध कार्य के रूप में लिखें जहां डेटा आता है - बस मान लें कि यह वहां है।

अगला लपेटें कि आईओ में शुद्ध कार्यक्षमता आपके शुद्ध कार्यों के डेटा को खिलाने और परिणामों को कहीं और रखने के लिए। यह ठीक है कि चैट एप्लिकेशन में बहुत है! आईओ मोनैड बिल्कुल अक्षम नहीं है, यह सिर्फ इतना है कि हम उतना ही कोड रखना पसंद करते हैं जितना हम इसे से बाहर कर सकते हैं क्योंकि यह अच्छी डिजाइन है - आईओ से अलग डेटा क्रंचिंग रखें। एक चैट एप्लिकेशन उस डेटा के साथ बहुत अधिक गणना नहीं करता है, इसलिए आईओ कोड का भार ठीक है।

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

मैंने दुनिया में best imperative programming language के रूप में वर्णित हास्केल के मोनैड को सुना है। मैं उस विवरण पर बाल विभाजित कर सकता हूं, लेकिन मैं भावना से सहमत हूं, और हां, हास्केल के साथ छड़ी। प्रोग्रामिंग में हास्केल अच्छा है जिसके लिए आप इसका उपयोग कर रहे हैं।

+4

अच्छा जवाब। बस मैं 'असुरक्षित *' का उपयोग करने के खिलाफ अधिक दृढ़ता से समर्थन करता हूं। शुद्ध और अशुद्ध कंप्यूटेशंस को अलग करने के लिए 'असुरक्षित *' का उपयोग करके आप जो हास्केल को लागू करते हैं, उसे खो देंगे। और आलसी मूल्यांकन के साथ संयुक्त, 'असुरक्षित *' आपके जीवन को दुखी कर देगा। –

+1

अच्छा बिंदु। मैंने असुरक्षित के खिलाफ सलाह को बढ़ा दिया है, लेकिन मैंने आपकी अच्छी टिप्पणी के लिए आलसी + असुरक्षित बिंदु छोड़ दिया है। – AndrewC

+1

ग्रीट उत्तर धन्यवाद! – user1748906

12

जब भी आप ध्यान दें कि आपके पास आईओ मोनैड के अंदर रहने वाला एक लंबा कार्य है, तो यह रोकता है और गणना की गणना करता है। मेरे अनुभव में, यह हमेशा (लगभग) मामला है कि कुछ गैर-आईओ संबंधित सामान चल रहे हैं, जिन्हें इनपुट आउटपुट तक पहुंच की आवश्यकता नहीं है और शुद्ध फ़ंक्शंस में encapsulated किया जा सकता है।

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

5

मेरी कोड के सबसे आईओ monads

यह ठीक है के भीतर लिखे गए।

और unsafePerformIO

वह बुरी है! प्लेग की तरह unsafePerformIO का उपयोग करने से बचें; इसका उपयोग केवल अनुभवी हास्केलर्स द्वारा बहुत विशिष्ट परिस्थितियों में किया जाना चाहिए।

क्या यह करना ठीक है, या इस उद्देश्य के लिए सही उपकरण नहीं है?

आईओ मोनैड में कोड लिखना ठीक है, लेकिन unsafePerformIO का उपयोग करने के लिए ठीक नहीं है। इसके बजाय, Monad इंटरफ़ेस (do नोटेशन) का उपयोग करके आईओ क्रियाओं को लिखना सीखें। जानें कि कौन से फ़ंक्शन प्रकार हस्ताक्षर IO प्रकार को शामिल करने की आवश्यकता है।

+2

unsafePerformIO का उपयोग करने से बचें! आईओ monads में एसटीएम लेनदेन कैसे शुरू करें? – user1748906

+2

@ user1748906 'परमाणु रूप से' का प्रयोग करें। –

+3

@ user1748906 यदि आप टाइप हस्ताक्षर [एसटीएम ए -> आईओ ए] (http://www.haskell.org/hoogle/?hoogle=STM+a+-%3E+IO+a) होलोग करते हैं, तो पहली हिट ' परमाणु रूप से, जैसा कि पाथरीन की लौ ने सुझाव दिया था। –