2013-03-14 4 views
6

मेरे पास एक ऐसा कार्य है जिसे मैंने क्लोजर Google समूह में एक चर्चा से मूल रूप से झुकाया है, जो संग्रह और मनमानी लंबाई के कार्यों की एक सूची लेता है, और इसे मूल सूची के सभी तत्वों वाले एक नए संग्रह को वापस करने के लिए फ़िल्टर करता है जिसके लिए कार्यों में से कम से कम एक सही का आकलन:क्लोजर आंशिक आवेदन - कार्यों का संग्रह वापस करने के लिए 'मानचित्र' कैसे प्राप्त करें?

(defn multi-any-filter [coll & funcs] 
    (filter #(some true? ((apply juxt funcs) %)) coll)) 

मैं चारों ओर Project Euler Problem 1 करने के लिए एक generalizable समाधान बनाने के साथ खेल रहा हूँ, इसलिए मैं इसे इस तरह उपयोग कर रहा हूँ:

(def f3 (fn [x] (= 0 (mod x 3)))) 
(def f5 (fn [x] (= 0 (mod x 5)))) 

(reduce + (multi-any-filter (range 1 1000) f3 f5)) 

कौन सा सही जवाब देता है ।

हालांकि, मैं यह संशोधित करने के लिए तो मैं कार्यों के बजाय यह करने के लिए ints पारित कर सकते हैं, जैसे

(reduce + (multi-any-filter (range 1 1000) 3 5)) 

जहाँ मैं ints की एक मनमाना संख्या के साथ 3 और 5 की जगह और के समारोह रैपिंग कर सकते हैं (चाहते हैं = 0 (mod xy)) बहु-किसी-फ़िल्टर फ़ंक्शन के अंदर एक अज्ञात फ़ंक्शन के रूप में।

दुर्भाग्य से यह मेरी क्लोजर क्षमता की सीमा से पहले है। मैं सोच रहा हूं कि मुझे map के साथ तर्क की सूची में कुछ करने की आवश्यकता होगी, लेकिन मुझे यकीन नहीं है कि कार्यों की सूची लौटने के लिए map कैसे प्राप्त करें, जिनमें से प्रत्येक एक और तर्क की प्रतीक्षा कर रहा है। क्लोजर अन्य कार्यात्मक भाषाओं में इसे कैसे करना है, इस तरीके को समझने का समर्थन नहीं करता है। शायद मुझे सही स्थान पर partial का उपयोग करने की आवश्यकता है, लेकिन मुझे पूरा यकीन नहीं है कि कैसे।

दूसरे शब्दों में, मैं युक्तियों के स्वेच्छाचारी संख्या (कि कार्यों नहीं हैं) पारित करने के लिए और फिर उन तर्कों में से प्रत्येक में एक ही समारोह में लिपटे मिल है, और फिर कार्यों की उस सूची juxt के लिए पारित हो जाता है सक्षम होना चाहते हैं funcs के स्थान पर मेरे multi-any-filter फ़ंक्शन में।

किसी भी सुझाव के लिए धन्यवाद!

उत्तर

6
(defn evenly-divisible? [x y] 
    (zero? (mod x y))) 

(defn multi-any-filter [col & nums] 
    (let [partials (map #(fn [x] (evenly-divisible? x %)) nums) 
     f (apply juxt partials)] 
    (filter #(some true? (f %)) col))) 

मैं partial उपयोग करें, क्योंकि यह fn के पहले स्थान में आर्ग लागू होता है coudn't। हम इसे evenly-divisible? की दूसरी स्थिति में चाहते हैं हम evenly-divisible? में फिर से व्यवस्थित कर सकते हैं लेकिन फिर स्टैंडअलोन का उपयोग करते समय यह वास्तव में सही नहीं लगेगा।

user=> (reduce + (multi-any-filter (range 1 1000) 3 5)) 
233168 
+0

आप रॉक करते हैं, यह वही है जो मैं ढूंढ रहा था। – kyllo

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