2011-08-26 16 views
8

मैं इस उदाहरण का अनुसरण कर रहा हूँ द्वारा: http://groups.google.com/group/clojure/browse_thread/thread/99b3d792b1d34b56clojure फ़िल्टर नक्शे कुंजी

(पिछले जबाब देखें)

और इस छुपे त्रुटि मैं जाता है कि:

Clojure 1.2.1 
user=> (def m {:a "x" :b "y" :c "z" :d "w"}) 
#'user/m 
user=> (filter #(some % [:a :b]) m) 
java.lang.IllegalArgumentException: Key must be integer 
(user=> 

इसके अलावा, मैं डॉन समझ में नहीं आता क्यों यह काम करेगा। क्या (कुछ ...) पहले मिलान मूल्य, "एक्स", हर बार वापस करने जा रहा है? मैं क्लोजर पर कुल नोब हूं और सीखने की कोशिश कर रहा हूं।

कृपया मुझे प्रबुद्ध करें।

+0

आपके द्वारा लिंक किए गए ggroup थ्रेड से कोड एक अलग समस्या हल करता है: "दिए गए * * मानचित्रों का एक संग्रह और चाबियों का एक सेट, दिए गए मानचित्रों में से एक संग्रह को वापस लौटाता है जिसमें कम से कम एक कुंजी शामिल होती है "। इस प्रकार, इस कोड में, 'फ़िल्टर' नक्शे के संग्रह पर काम करने के लिए है, न कि एक नक्शा; और यह विशेष '# (...)' कुछ 'शामिल ब्लॉक' केवल तभी उपयुक्त है जब दिए गए मानचित्र में 'शून्य' या 'झूठी' मान नहीं हैं (जैसा कि धागे में उल्लिखित है), लेकिन किसी भी मामले में, इसे कार्य करें बदले में दिए गए प्रत्येक मानचित्र में रिटर्न लागू किया जाएगा (आलसी)। –

+0

ठीक है कि मेरी गलतफहमी बताता है, धन्यवाद। – Kevin

उत्तर

8

यदि आप मानचित्र पर "पुनरावृत्त" करते हैं, तो आपको कुंजी के बजाय कुंजी-मूल्य जोड़े मिलेंगे। उदाहरण के लिए,

user=> (map #(str %) {:a 1, :b 2, :c 3}) 
    ("[:a 1]" "[:b 2]" "[:c 3]") 

इस प्रकार अपने गुमनाम समारोह (some [:a "x"] [:a :b]) जो स्पष्ट रूप से काम नहीं करता है मूल्यांकन करने के लिए कोशिश करता है।

विचारशील समाधान select-keys का उपयोग किसी अन्य उत्तर में उल्लिखित है।

+5

बस नाइटपिकिंग का एक छोटा सा हिस्सा: आप कह सकते हैं (नक्शा str {: a 1: b 2}) जो थोड़ा अधिक मूर्खतापूर्ण है। str और # (str%) कार्यात्मक रूप से समकक्ष हैं। – Gert

26

मुझे लगता है कि मैं सिर्फ डॉक्स अधिक पढ़ने के लिए की जरूरत:

(select-keys m [:a :b]) 

हालांकि मैं अभी भी यकीन है कि क्या इरादा उदाहरण मैंने पाया के साथ था नहीं कर रहा हूँ ...

1
(filter 
    (fn [x] 
    (some #{(key x)} [:a :b])) m) 

करना चाहेंगे filter और some (लेकिन उलझन और धीमी) का उपयोग कर।

यह m से फ़िल्टर करके सभी [:a :b] सेट #{(key x)} (यानी एक सेट के रूप में सेट का उपयोग करके) में है, फिर मानचित्र प्रविष्टि वापस करें।