2013-01-07 35 views
6

मैं नए Clojure 1.5 reducers पुस्तकालय के लिए निम्न उदाहरण कन्वर्ट करने के लिए कोशिश कर रहा हूँ के साथ तह:Clojure पुस्तकालय reducers - अधिकतम

(reduce max (map inc (range 10))) 
;=> 10 

जब मैं है- बदल मैं निम्नलिखित त्रुटि मिलती है:

(r/fold max (r/map inc (range 10))) 
;ArityException Wrong number of args (0) passed to: core$max clojure.lang.AFn.throwArity (AFn.java:437) 

क्या कोई मुझे सही समाधान दे सकता है?

उत्तर

10

ध्यान दें कि यह को + के साथ प्रतिस्थापित करते समय यह काम करता है।

(r/fold + (r/map inc (range 10))) 
; => 55 

अंतर तथ्य यह है कि unlike +maxdoes not have कोई तर्क के साथ एक मंगलाचरण के लिए एक मामला। r/fold संयोजन संयोजन की आवश्यकता है-i.e। max - तर्क के बिना बुलाए जाने पर पहचान मान प्रदान करने के लिए। * के लिए यह 1 है, + के लिए यह 0 है।

एक संभावित समाधान एक max' जो max रूप में कार्य करता है, लेकिन जब कोई तर्कों के साथ कॉल यह max समारोह के लिए नकारात्मक infinity- an identity element रिटर्न परिभाषित करने के लिए किया जाएगा।

(defn max' 
    ([] Double/NEGATIVE_INFINITY) 
    ([& args] (apply max args))) 
(r/fold max' (r/map inc (range 10))) 
; => 10 

उसी परिणाम को r/monoid फ़ंक्शन का उपयोग करके हासिल किया जा सकता है।

(r/fold (r/monoid max #(Double/NEGATIVE_INFINITY)) (r/map inc (range 10))) 

आगे की चर्चा के लिए Reducers - A Library and Model for Collection Processing देखते हैं, खंड सादगी अवसर है।

+0

ठीक है - ऐसा लगता है कि वे यहाँ गूगल समूह में चर्चा की: https://groups.google.com/forum/?fromgroups=#!searchin/clojure/reduce$20max/clojure/EJ9hOZ8yaos/TULab4pndwoJ – hawkeye

+1

@Jan इसके लिए 'मोनॉयड' नामक एक सहायक एफएन है, इसका उपयोग करके, आपका दूसरा कोड उदाहरण उदाहरण के लिए कम हो जाता है '(आर/फोल्ड (आर/मोनोइड अधिकतम # (डबल/NEGATIVE_INFINITY)) (आर/मैप इंक (रेंज 10))) –

+0

@ यूजीनबेरेसोवस्की, धन्यवाद, मुझे 'मोनॉयड' फ़ंक्शन के बारे में पता नहीं था। मैंने जवाब अपडेट कर लिया है। – Jan

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

  • कोई संबंधित समस्या नहीं^_^