2012-07-08 19 views
5

Clojure समारोहक्लोजर फ़ंक्शन क्यों नहीं है जिसमें आलसी फ़ंक्शन कॉल आलसी भी आते हैं?

(reductions + 0 (cycle [1 1 -1])) 

एक दृश्य पैदा करता है [0 1 2 1 2 3 2 3 4 3 4 5 ...]। दुर्भाग्यवश, यह अनुक्रम आलसी नहीं है।

cycle और reductions दोनों आलसी अनुक्रम लौटने के रूप में प्रलेखित हैं, मुझे उम्मीद है कि उन कार्यों के इस संयोजन को आलसी अनुक्रम वापस करने की उम्मीद है। अनुक्रम को आलसी लौटने के लिए मैं इसे कैसे और कैसे ठीक कर सकता हूं?

एक अधिक जटिल उदाहरण है कि एक ही समस्या से पता चलता:

(reductions (fn [x f] (f x)) 0 (cycle [inc inc dec])) 

(मुझे लगता है कि किसी भी फर्क नहीं पड़ता मामले में यह दिखाने के लिए, क्योंकि इस संस्करण की तरह मैं अंत में काम करना चाहते हैं है,)

उत्तर

9

दुर्भाग्य से, यह अनुक्रम आलसी नहीं है।

ओह, हाँ, यह है। हम जल्दी से जांच कर सकते हैं कि वह अपने पहले 10 तत्वों लेने के द्वारा आलसी है:

(take 10 (reductions + 0 (cycle [1 1 -1]))) 

यह बहुत जल्दी एक जवाब है, जो साबित करता है अनुक्रम आलसी है देता है। क्या फ़ंक्शन आलसी नहीं था, यह अनंत अनुक्रम में सभी तत्वों को महसूस करने का प्रयास करेगा, और स्मृति को उड़ा देगा, या एक अनंत लूप में लटका होगा।

क्या होता है कि आप आरईपीएल में यह func टाइप कर रहे हैं, जो आपको इसे दिखाने से पहले अनुक्रम को समझने का प्रयास करता है।

संपादित करें:stop infinite loops को यह टिप का उपयोग करता है, तो आप कभी भी पाया है कि आप को ट्रिगर करने वाली या गलती से एक अनंत seq को साकार करने की कोशिश की है।

+0

धन्यवाद :)। मैंने इसे रोकने के लिए अनुक्रम को एक (डीफ ...) द्वारा अलियासिंग करने की कोशिश की, लेकिन निश्चित रूप से (अब मुझे एहसास हुआ) जो काम नहीं करता है। इसे नामित करना (defn ...) ठीक काम करता है। – Confusion

+1

यह जांचने का एक और सटीक तरीका है कि कोई फ़ंक्शन आलसी है या नहीं, इसे एहसास में लपेट रहा है? । अगर वह झूठा लौटाता है तो यह काम आलसी है। => (एहसास हुआ? (कटौती +0 (चक्र [1 1 -1])) झूठी – NielsK

+1

'एहसास हुआ?' इस उद्देश्य के लिए बहुत खराब काम करता है (वास्तव में, ज्यादातर उद्देश्यों के लिए; उम्मीद है कि यह जल्द ही सुधार हो जाएगा)। इन सभी मानों पर 'एहसास हुआ?' आज़माएं: '[]', 'nil',' '(a b c) ',' (iterate inc 0) ', और आप देखेंगे कि मेरा क्या मतलब है। – amalloy

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