9

क्लोजर में प्राकृतिक संख्याओं के आलसी अनुक्रम को परिभाषित करना आसान है: (def N (iterate inc 0))। अनजाने में, अगर हम क्लोजर से (apply min N) का उपयोग करके न्यूनतम एन को खोजने के लिए कहते हैं, तो यह एक अनंत regress में फंस जाता है।क्लोजर को समझने में मैं कैसे मदद कर सकता हूं कि 0 सबसे छोटा प्राकृतिक नंबर है?

क्या इस तथ्य को "निर्माण" करने का कोई तरीका है कि (= 0 (min N)) एन की डेटा संरचना में? स्पष्ट रूप से, हम यह जानते हैं, क्योंकि वृद्धि कार्य inc सख्ती से बढ़ रहा है। min फ़ंक्शन इस ज्ञान का फायदा उठाने के बारे में नहीं जानता है, और इसके बजाय जवाब को बल देने के लिए मजबूर करने का प्रयास करता है।

मुझे नहीं पता कि इस प्रोग्रामेटिक रूप से एन्कोड कैसे करें। मैं अतिरिक्त संरचना के साथ आलसी अनुक्रमों का निर्माण करने का एक तरीका चाहूंगा जैसे कि & संबंध)। मैं ऑप्टिमाइज़ेशन समस्याओं को हल करने के लिए इन बाधाओं का फायदा उठाने का एक तरीका भी पसंद करूंगा (जैसे अनुक्रम का न्यूनतम या न्यूनतम)।

क्या देशी क्लोजर में ऐसा करने का कोई तरीका है? Datomic के साथ क्या?

+0

डाटामिक इस में फिट कहां है? क्या आप उस अतिरिक्त बाधा को स्टोर करने की कोशिश कर रहे हैं? – Jared314

उत्तर

6

आप अपने विशिष्ट उदाहरण के लिए मेटाडेटा का उपयोग कर सकते हैं।

(defn my-range 
    ([] (my-range 0)) 
    ([n] (with-meta 
     (cons n (lazy-seq (my-range (inc n)))) 
     {:onlyincreases true}))) 

(defn my-min [x] (if (:onlyincreases (meta x)) (first x) (min x))) 

(my-min (my-range)) ;; => 0 
(my-min (next (my-range))) ;; => 1 
(my-min (nnext (my-range))) ;; => 2 

यदि आपको कुछ और सामान्यीकृत करने की आवश्यकता है, तो आपको अपना खुद का प्रकार बनाने की आवश्यकता हो सकती है।

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