2013-04-28 7 views
10

क्या यह निर्धारित करने का एक बेवकूफ तरीका है कि LazySeq में कोई तत्व है या नहीं? Clojure 1.5 के रूप में बुला contains? एक IllegalArgumentException फेंकता है:क्लोजर: कॉल करने के लिए बेवकूफ तरीका शामिल है? आलसी अनुक्रम पर

IllegalArgumentException contains? not supported on type: clojure.lang.LazySeq  
clojure.lang.RT.contains (RT.java:724) 

1,5 से पहले, जहाँ तक मुझे पता है, यह हमेशा झूठे लौट आए।

मुझे पता है कि LazySeq पर contains? पर कॉल करना कभी वापस नहीं हो सकता है क्योंकि यह अनंत हो सकता है। लेकिन अगर मुझे पता है कि यह नहीं है और परवाह नहीं है तो इसका उत्सुकता से मूल्यांकन किया जाता है?

क्या मैं के साथ आया है:

(defn lazy-contains? [col key] 
    (not (empty? (filter #(= key %) col)))) 

लेकिन यह बहुत सही नहीं लगता है। क्या कोई बेहतर तरीका है?

उत्तर

11

सबसे पहले, आलसी seqs सदस्यता की जांच के लिए कुशल नहीं हैं। एक आलसी seq के बजाय एक सेट का उपयोग करने पर विचार करें।

यदि कोई सेट अव्यवहारिक है, तो आपका समाधान खराब नहीं है। कुछ संभावित सुधार:

  1. "खाली नहीं" थोड़ा अजीब है। बस सीक का उपयोग करना एक शून्य-या-सत्य मूल्य प्राप्त करने के लिए पर्याप्त है जो आपके उपयोगकर्ता किसी भी रूप में उपयोग कर सकते हैं। यदि आप सच या गलत चाहते हैं तो आप इसे बुलियन में लपेट सकते हैं।

  2. चूंकि आप केवल पहले मैच की परवाह करते हैं, आप फ़िल्टर और सीक के बजाय कुछ का उपयोग कर सकते हैं।

  3. समानता भविष्यवाणी लिखने का एक सुविधाजनक तरीका एक शाब्दिक सेट के साथ है, जैसे कि # {कुंजी}, हालांकि यदि कुंजी शून्य है तो यह हमेशा शून्य हो जाएगी कि शून्य हमें नहीं मिला है।

सभी एक साथ आप देता है:

(defn lazy-contains? [col key] 
    (some #{key} col)) 
+0

एक कुंजी के रूप में शून्य होने का मामला कुछ हद तक गलत बनाता है। लेकिन चूंकि मेरे मामले में कुंजी कभी भी शून्य नहीं है, मैं इसके साथ रह सकता हूं। – nansen

+0

दाएं। इसे ठीक करने के लिए, बस अपनी मूल भविष्यवाणी का उपयोग करें: (कुछ # (= key%) col) – Chouser

+0

@Chouser मैं इन विकल्पों में से किसी एक को किसी विशेष उपयोग के लिए लागू करने का प्रयास कर रहा हूं और निम्न समस्या में चल रहा हूं। मैं इसे मूल रूप से अधिक मिलान करने के लिए कैसे प्राप्त करूं? कार्यक्षमता? (आलसी-युक्त? {: राज्य "सक्रिय",: course_n "कानून",: course_i "सी 0"}: राज्य) शून्य देता है लेकिन उपयोग करते समय? यह सच है मैं clojuredocs के माध्यम से भी ग्रोक करने की कोशिश कर रहा हूं और इसे ठीक करने के तरीके को नहीं देख रहा हूं। – RatavaWen

4

यदि आप अपने उदाहरण में filter के बजाय some का उपयोग करते हैं, तो आपको पूरे अनुक्रम के मूल्यांकन को मजबूर करने के बजाय एक मूल्य तुरंत मिलने पर तत्काल वापसी मिल जाएगी।

(defn lazy-contains? [coll key] 
    (boolean (some #(= % key) coll))) 

संपादित: यदि आप एक बूलियन के लिए परिणाम मजबूर नहीं है, तो ध्यान दें कि आप nil बजाय false मिलेगा अगर कुंजी नहीं मिला है।

+0

फिल्टर का प्रयोग के रूप में मैंने किया था जब तक पूरा अनुक्रम का मूल्यांकन नहीं करता है के रूप में मूल्य पहले पाया जाता है। '(आलसी-शामिल है? (रेंज) 100) 'सच आती है। तो क्या यह आपके कार्य के बराबर नहीं है? – nansen

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