2011-09-06 2 views
6

में Seq इंटरफ़ेस को लागू करना चाहिए मैं Clojure में एक डेटा संरचना है जो एक प्रयोग से परिणामों के एक सेट का प्रतिनिधित्व करता है:मैं clojure

(defprotocol ResultSet 
    (columns [rs] "return a collection of the columns in the resultset, represented by keywords") 
    (rows [rs] [rs column-keys] "returns a seq of the rows in the resultset, order and column specified as keywords by column-keys. with a single argument returns rows with all columns present")) 

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

हास्केल में मैं प्रासंगिक टाइपक्लास (जैसे फंक्टर) को कार्यान्वित करके और फिर एफएमएपी या एमफिल्टर जैसे कार्यों का उपयोग करके ऐसा करता हूं। तो मैंने क्लोजर में ऐसा करने में देखा और आईएसईक इंटरफ़ेस को लागू करने के बारे में कुछ विचारों के साथ घायल हो गया।

तो, क्या यह एक अच्छा विचार है? मुझे आईएसईक लागू करने के बारे में कई संसाधन नहीं मिल रहे हैं और मैं सोच रहा हूं कि इसके लिए मूर्खतापूर्ण दृष्टिकोण क्या है।

उत्तर

5

जहां तक ​​मैं कह सकता हूं, इस तरह कुछ लागू करने का "सर्वोत्तम" तरीका आईएसईक लागू नहीं करना है, लेकिन clojure.lang.Seqable; दूसरे शब्दों में, अपने परिणामसेट को एक (संभवतः आलसी) अनुक्रम में मैप करने के लिए (.seq) का कार्यान्वयन प्रदान करें। यह मार्ग क्लोजर सबसे अधिक (सभी?) संग्रहों के लिए सूची को छोड़कर उपयोग करता है (सूची आईएसईक लागू करती है, क्योंकि सीईसी एपीआई पहले ही सूची एपीआई का सबसेट है)।

+0

यह मुझे परिणामस्वरूप पंक्तियों के अंतर्निहित अनुक्रम को वापस करने की तरह कुछ करने की अनुमति देगा, लेकिन यह मुझे 'परिणाम' पर एक फ़ंक्शन को मैप करने की अनुमति नहीं देता है और 'परिणाम' वापस प्राप्त करता है? संपादित करें: मुझे अभी एहसास हुआ है कि नक्शा में निर्मित इस तरह व्यवहार नहीं करता है, शायद मैं गलत काम करने की कोशिश कर रहा हूं। –

+1

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

0

मुझे लगता है कि मैं आपके प्रश्न को गलत समझ रहा हूं लेकिन क्या आप अपने परिणाम में प्रत्येक तत्व को फ़ंक्शन लागू करने के लिए मानचित्र का उपयोग नहीं करेंगे।