2015-09-19 6 views
7

जब मैं "संशोधित राशि" संकलन («_sum_folds.hs») फ़ाइल:ट्रेस परतों में प्रसंस्करण के एकदम विपरीत दे सकते हैं

*--------------------------- [ 

import Debug.Trace 

_sum = 
    foldl (\ acc x -> 
      trace (
       show x 
       ++ " - " ++ show acc 
      ) 
      acc + x 
     ) 
     0 

*--------------------------- ] 

[1 of 1] Compiling Main    (_sum_folds .hs, interpreted) 
Ok, modules loaded: Main. 

... और यह करने के लिए लागू '[1..5 ] ', मैं मिलता है:

*Main > _sum ([1..5]) 

* 1 - 0 
* 2 - 1 
* 3 - 3 
* 4 - 6 
* 5 - 10 
* 15 
* it :: Integer 

(एक के लिए आदेश' foldl 'प्रक्रिया ठीक है ...)

अगर मैं < ++ हटाने "-" दिखाने ++ एसीसी>, मैं :

*Main > _sum ([1..5]) 

* 5 
* 4 
* 3 
* 2 
* 1 
* 15 
* it :: Integer 

... (हम केवल < ट्रेस (शो एक्स)> है): अंदर < [1..5]> ('एक्स के) तत्वों के प्रसंस्करण के आदेश किया गया है लगता है उलटा (यह एक 'foldl' है) ...!

इसका क्या अर्थ है?

+0

में चित्र [इस उत्तर] (http://stackoverflow.com/a/2169743/2476735) मदद कर सकता है। –

उत्तर

5

अभिव्यक्ति foldl (+) 0 [1..3] निम्नलिखित अभिव्यक्ति पेड़ बनाता है:

   + 
      /\ 
      + 3 
     /\ 
      + 2 
     /\ 
     0 1 

आपके मामले में दोनों _sum और _sum2 इस तरह एक पेड़ का निर्माण:

   tr 
      /\ 
      tr 3 
     /\ 
      tr 2 
     /\ 
     0 1 

यहाँ tr गुना जो करता है में समारोह है संचय और ट्रेसिंग।

_sum2

पहला ऑपरेशन का दौरा किया जा करने के लिए पेड़ के शीर्ष पर tr ___ 3 है। है और tr फ़ंक्शन में ___ acc है।

जब यह _sum2 में होता है तो 3 मुद्रित होता है।

फिर acc का मूल्यांकन किया गया है, इसलिए tr ___ 2 का मूल्यांकन किया गया है जिसके परिणामस्वरूप 2 प्रदर्शित हो रहे हैं।

फिर tr ___ 1 का मूल्यांकन किया गया है, इसलिए 1 मुद्रित है।

_sum

हालांकि, _sum में घटनाओं की एक अंतर कोर्स करेंगी (कोई यमक इरादा)।

हम फिर से पेड़ के शीर्ष पर शुरू होते हैं: tr ___ 3

चरण 1) के बाद से _sum में आप भी acc बाहर प्रिंट कर रहे हैं, हास्केल करने की जरूरत है यह मूल्यांकन, अर्थात tr ___ 2। जब यह मूल्यांकन पूर्ण होने के लिए इसे बाहर acc प्रिंट होगा और उसके बाद 3.

चरण 2) tr ___ 2 मूल्यांकन करने के लिए, जब से तुम acc बाहर प्रिंट कर रहे हैं, हास्केल यह मूल्यांकन करने के लिए की जरूरत है, अर्थात्पेड़ के बाईं ओर पेड़ - अर्थात् tr ___ 1। जब यह मूल्यांकन पूर्ण होने के लिए इसे बाहर acc प्रिंट होगा और उसके बाद 2.

चरण 3) tr ___ 1 मूल्यांकन करने के लिए, जब से तुम acc बाहर प्रिंट कर रहे हैं, हास्केल 1 के बाईं ओर पेड़ का मूल्यांकन करने की जरूरत है, यानी 0. जब यह मूल्यांकन पूर्ण होने के लिए इसे बाहर acc प्रिंट होगा और उसके बाद 1. इस मामले 0 में पहले से ही मूल्यांकन किया जाता है, तो यह बाहर 0 तो स्थानान्तरण वापस प्रिंट और उसके बाद 1.

नियंत्रण चरण 2 और acc है प्रदर्शित (1) और फिर 2.

नियंत्रण फिर वापस स्थानांतरित कर देता है चरण 1 और acc (3) प्रदर्शित किया जाता है और 3

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