2016-12-25 7 views
5

एकमात्र लाभ जो मैं देख सकता हूं वह यह है कि इसका मतलब है कि कोई partial पर कॉल से बचाता है।क्यों क्लोजर थ्रेड आखिरी (- >>) एक मैक्रो है?

(defn foldl [f acc xs] 
    (loop [acc acc 
     xs xs] 
    (if (empty? xs) 
     acc 
     (recur (f (first xs) acc) (rest xs))))) 

(defn $ [f x] (f x)) 

(defn thread-last [x & rest] 
    (foldl $ x rest)) 

देता है:

(thread-last (range 10) 
      (partial map inc) 
      (partial filter odd?) 
      (partial reduce +)) => 25 

(->> (range 10) 
    (map inc) 
    (filter odd?) 
    (reduce +)) => 25 

वहाँ रहे हैं किसी भी मामले हैं जब एक कार्यात्मक/स्पष्ट संस्करण विफल हो जाएगा?

+0

क्या आप ऐसे मामलों की मांग कर रहे हैं जहां प्रत्येक फॉर्म की शुरुआत में 'आंशिक' चिपकाना काम नहीं करेगा, या आप * उपयोगी * ऐसे मामलों के लिए पूछ रहे हैं? –

+0

पहला, जैसा कि कोई व्यक्ति आंशिक (या तर्क प्लेसमेंट के लिए लैम्ब्डा) का उपयोग नहीं कर सकता था। – beoliver

उत्तर

12

सबसे पहले, ध्यान दें कि आपका foldl सिर्फ reduce है। हमारी भाषा नहीं है हास्केल की तुलना में बहुत गरीब!

दूसरा, सभी रूपों में फ़ंक्शन कॉल नहीं हैं, और ->> सभी रूपों को फिर से लिख सकते हैं। उदाहरण के लिए, आप ->> इस्तेमाल कर सकते हैं कुछ हास्केल के where खंड की तरह एक सा लागू करने के लिए:

(defn mapcat' [f xs] 
    (->> (apply concat mapped) 
     (let [mapped (map f xs)]))) 

नहीं वास्तव में एक शैली है कि Clojure प्रोग्रामर के साथ लोकप्रिय है, लेकिन यह कुछ ->> का एक उदाहरण के रूप में कार्य करता है क्या कर सकते हैं कि partial 'कर सकते हैं टी।

+0

कोई नकारात्मक अर्थ इरादा नहीं था :) मैं इन दिनों उत्पादन में क्लोजर का उपयोग कर रहा हूं, इसलिए यह किसी भी 'जादू' को फैलाने के बारे में अधिक है। मैंने फ़ोल्डल लिखा क्योंकि मैं एक फोल्ड-टाइम और अन्य संरचनाओं के साथ खेल रहा था। – beoliver

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