2013-05-21 7 views
6

मैंने गेम सर्वर के लिए हास्केल का उपयोग करने के बारे में सोचा है, लेकिन कोडिंग करते समय, मैंने खुद को उस हिस्से को देखकर पाया जहां मैंने पैकेट को "वाह," इसके परिणामस्वरूप बहुत सारे पैटर्न मिलान होंगे " । यह देखने के लिए मैचों की मात्रा बहुत अधिक है (वहां चलें, उस पर हमला करें, लूट करें, इसे खोलें, और इसी तरह)।हास्केल में बहुत सारे पैटर्न कुशलतापूर्वक

मैं क्या है:

  1. एक पैकेट
  2. प्राप्त हेक्साडेसिमल स्ट्रिंग में पैकेट शीर्षक पार्स (कहते हैं कि उदाहरण के लिए "02B5")
  3. पैकेट से डेटा के बाकी जाओ
  4. पार्सियो
  5. पैकेट सामग्री
में मिलान शीर्षलेख में मिलान शीर्षलेख

स्ट्रिंग -> विधि को मैप करना आसान होगा, लेकिन विधियों में अलग-अलग पैरामीटर हैं।

मैंने नीचे दिखाए गए पैटर्न मिलान के सरल दो तरीकों के बारे में सोचा।

#1 
packetIO :: String -> IO() 
packetIO packet = 
    case packet of 
    "02B5" -> function1 
    "ADD5" -> function2 
    ... and so on 

#2 
packetIO :: String -> IO() 
packetIO "02B5" = function1 
packetIO "ADD5" = function2 
... and so on 

प्रदर्शन को देख और शैली कोडिंग दोनों, वहाँ एक रास्ता बेहतर पैकेट को संभालने के लिए ग्राहक से प्राप्त है?

यदि आपके पास कोई संसाधन या लिंक हैं जो मैं ढूंढने में विफल रहा, तो कृपया मुझे उनकी दिशा में इंगित करें!

संपादित 130,521:

दोनों विकल्प हैं, नीचे सूचीबद्ध की तरह लगता है, अच्छा विकल्प हैं। मेरे सामने सबसे अच्छा समाधान चुनने से पहले टिप्पणियों में मेरे सवालों के जवाब देखने का इंतजार कर रहा था।

  1. मानचित्र संरचना में संग्रह (बाइटस्ट्रिंग -> फ़ंक्शन)। ओ (लॉग एन)
  2. बाइटस्ट्रिंग को Word16 और पैटर्न मिलान में कनवर्ट करना। हे (लॉग एन) देखने टेबल

संपादित 130,521 के माध्यम से पेड़ या हे (1) के माध्यम से:

Word16 के साथ मिलान के रूप में फिलिप जेएफ कहा पैटर्न लिए जाने का फैसला।

packetIO 0x02B5 = function1 
packetIO 0xADD5 = function2 
etc 
+9

'मानचित्र' ('डेटामैप' से, ''कंटेनर' से) (http://hackage.haskell.org/package/containers) के लिए नौकरी की तरह लगता है) , 'बाइटस्ट्रिंग' के साथ (मुझे वास्तव में 'स्ट्रिंग' पसंद नहीं है;)) कुंजी प्रकार और ** हैंडलर फ़ंक्शन का प्रकार मान प्रकार ** के रूप में। यदि आपके पास निश्चित लंबाई के छोटे पैकेट हैं, तो 'Data.Word' (जैसे' Word16') से एक प्रकार एक कुंजी के रूप में पर्याप्त होगा। उस स्थिति में, आप बेहतर प्रदर्शन के लिए 'Data.IntMap' का भी उपयोग करना चाहेंगे। –

+0

@Rhymoid: क्या आप इसे उत्तर में बदल सकते हैं, ताकि मैं इसे ऊपर उठा सकूं? –

+0

@Rhymoid: प्राप्त डेटा वास्तव में शुरुआत में बाइटस्ट्रिंग है। लेकिन नक्शा मुझे ओ (लॉग एन) समय जटिलता नहीं दे सकता है जब लुकअप टेबल के साथ विकल्प ओ (1) प्रदान करते हैं? और बाइटस्ट्रिंग की चाबियों का प्रतिनिधित्व कैसे किया जाएगा? लोड पर सभी प्रकारों के साथ 'पैक' का उपयोग करना? – Plankt

उत्तर

14

क्यों संख्या (Word16Data.Word में?) को पार्स नहीं और फिर तार का उपयोग कर के उस के साथ मिलान करते हैं, बजाय? हास्केल हेक्स अक्षर का समर्थन करता है ...

+0

परिणाम 16 में परिणाम पार्स करने के लिए, मुझे लगता है कि यह करने का तरीका होगा? 'पैकेट = अनपैक $ बाइटस्ट्रिंग.take 2 प्राप्त करें ' शब्द = इंटेग्रल (पैकेट !! 1) * 0x100 + से इंटेग्रल (पैकेट !! 0) :: Word16' फिर मिलान करें: 'पैकेटियो 0x02B5 -> function1' – Plankt

+0

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

10

दोनों की: दोनों महान विकल्प हैं और जब तक मेरा अनुमान है दोनों समान रूप से तेजी से है, मानचित्र तेजी से मैं Word16 में बदलने की जरूरत नहीं है देखकर हो सकता है, दूसरा विकल्प अपने प्रयोग के लिए अधिक पठनीय कोड दिया आपके कार्य बराबर हैं। कंपाइलर दूसरे को पहले स्थान पर ले जाता है। पैटर्न मिलान case के लिए वाक्य रचनात्मक चीनी है।

case इस तरह की चीज़ के लिए इष्टतम है। यह एक कूद तालिका में संकलित है, जो ओ (1) है। इसका मतलब है कि आपके द्वारा सूचीबद्ध दोनों समाधान इष्टतम हैं।

जहां तक ​​कोडिंग शैली जाती है, दोनों शैलियों पूरी तरह से मूर्ख हैं। मैं व्यक्तिगत रूप से पैटर्न मिलान पर case पसंद करता हूं, लेकिन मुझे पता है कि कई अन्य लोग शीर्ष-स्तरीय कार्यों के लिए पैटर्न मिलान पसंद करते हैं।

+4

क्या यह 'स्ट्रिंग' के साथ एक कूद तालिका में संकलित करता है? मुझे शक है। –

+0

@Rhymoid ओह, मैं पूरी तरह से याद किया। तब मुझे नहीं पता कि उस मामले में 'ghc' क्या करता है। –

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