2012-05-31 473 views
15

दें चलो कहते हैं कि मैं इस समारोह है: (हास्केल वाक्य रचना)गिना जा रहा है काम च एक्स = द्वारा किया (एक्स, एक्स)

f x = (x,x) 

काम (गणना की मात्रा) समारोह द्वारा किया जाता है?

पहले मैंने सोचा कि यह स्पष्ट रूप से स्थिर था, लेकिन अगर x का प्रकार सीमित नहीं है, यानी, x स्मृति की मनमाना मात्रा ले सकता है? x की प्रतिलिपि बनाकर किए गए कार्यों को ध्यान में रखना होगा, है ना?

इससे मुझे विश्वास हुआ कि फ़ंक्शन द्वारा किए गए काम वास्तव में इनपुट के आकार में रैखिक हैं।

यह अपने आप के लिए होमवर्क नहीं है, लेकिन आया था जब मैं काम समारोह के द्वारा किया परिभाषित करने के लिए किया था:

f x = [x] 

कौन सा ने वही समस्या है, मेरा मानना ​​है।

+0

http://cs.stackexchange.com/ – FlavorScape

+0

के लिए अच्छा सवाल क्या मुझे इसे स्थानांतरित करना चाहिए? (मान लीजिए कि मैं कर सकता हूं, मैं साइट से वास्तव में परिचित नहीं हूं) – Guido

+1

@ गुइडो आप इसे स्थानांतरित नहीं कर सकते हैं, हालांकि इसे गंतव्य पर ले जाना संभव नहीं है, मुझे लगता है कि यह भी फिट बैठता है। आईएमएचओ इसे यहां छोड़ना सबसे अच्छा है। – fuz

उत्तर

33

बहुत अनौपचारिक रूप से, काम किया गया आपकी भाषा के परिचालन अर्थशास्त्र पर निर्भर करता है। हास्केल, ठीक है, यह आलसी है, तो आप के लिए एक ही निरंतर कारकों का भुगतान: ढेर

  • पर x को

    • धक्का संकेत (,)
    • के लिए एक ढेर सेल का आवंटन अपने तर्कों
    • वापसी एक को (,) लागू ढेर सेल के लिए सूचक

    हो गया। ओ (1) काम, जब कॉलर f के परिणाम को देखता है तब किया जाता है।

    अब, यदि आप (,) के अंदर देखते हैं तो आप आगे मूल्यांकन ट्रिगर करेंगे - और यह कार्य x का मूल्यांकन करने के लिए काम पर निर्भर है। चूंकि हास्केल में x के संदर्भ साझा किए गए हैं, इसलिए आप इसका मूल्यांकन केवल एक बार करते हैं।

    तो यदि आप पूरी तरह से परिणाम का मूल्यांकन करते हैं तो हास्केल में काम ओ (x का काम) है। आपका फ़ंक्शन f केवल स्थिर कारकों को जोड़ता है।

  • +7

    आगे स्पष्टीकरण के लिए: '(,)' हास्केल में * बॉक्सिंग * टुपल है, जिसका अर्थ है कि यह एक ऐसा निर्माण है जो केवल पॉइंटर्स रखता है। यदि आपके पास ऐसी भाषा है जहां '(,)' एक * अनबॉक्स किए गए * टुपल बनाता है, तो हां, यह दोनों स्लॉट्स में 'x' क्लोन करने के लिए अतिरिक्त कार्य करेगा, यदि 'x' सूचक से बड़ा है, और काम की मात्रा 'x' के आकार के साथ तराजू। [जीएचसी अनबॉक्स किए गए tuples प्रदान करता है] (http://www.haskell.org/ghc/docs/7.4.1/html/users_guide/primitives.html#unboxed-tuples) '(#, #) 'विभिन्न सीमाओं के साथ। –

    1

    क्रिस ओकासाकी में कुछ कॉल (या कुल) आलस्य शुरू होने पर कार्य कॉल पर लगाए गए कार्य को निर्धारित करने का एक शानदार तरीका है। मेरा मानना ​​है कि यह अपने पेपर में शुद्ध रूप से कार्यात्मक डेटा संरचनाओं पर है। मुझे पता है कि यह पुस्तक संस्करण में है - मैंने पिछले महीने पुस्तक का हिस्सा पढ़ा था। मूल रूप से आप बनाए गए वादे/थंक के लिए निरंतर कारक लेते हैं, किसी भी उत्तीर्ण वादे/थंक्स का मूल्यांकन करने के लिए कुछ भी चार्ज नहीं करते हैं (मान लीजिए कि उन्हें पहले से ही मजबूर किया गया है/सामान्य रूप में हैं [न केवल डब्ल्यूएचएनएफ])। यह एक अनुमान है। यदि आप एक अतिवृद्धि शुल्क भी चाहते हैं तो फंक्शन द्वारा बनाए गए प्रत्येक वादे/थंक को सामान्य रूप से मजबूर करने/परिवर्तित करने की लागत भी। कम से कम, मुझे यह बेहद थका हुआ राज्य में याद है।

    ओकासाकी में इसे देखें: http://www.westpoint.edu/eecs/SitePages/Chris%20Okasaki.aspx#thesis - मैं इस्तेमाल की जाने वाली थीसिस की कसम खाता हूं।

    +0

    हास्केल में एक पॉलिमॉर्फिक तर्क होने पर ओकासाकी की विधि को अमान्य करना प्रतीत होता है। (1) यदि संभव हो तो बचें। (2) मैंने इसका पूरी तरह से विश्लेषण नहीं किया है, यह सिर्फ एक अंतर्ज्ञान है। –