2009-04-27 11 views
8

क्या जीएचसी डिफ़ॉल्ट रूप से निम्नलिखित फ़ंक्शन पर पूंछ-कॉल अनुकूलन करेगा? इसके बारे में एकमात्र अजीब चीज यह है कि यह एक आईओ कार्रवाई को दोबारा परिभाषित कर रहा है, लेकिन मुझे नहीं लगता कि यह टीसीओ क्यों नहीं हो सका।क्या जीएचसी आईओ कार्यों को अनुकूलित करने के लिए पूंछ-कॉल करने में सक्षम है?

import Control.Concurrent.MVar 

consume :: MVar a -> [a] -> IO() 
consume _ [] = return() 
consume store (x:xs) = do putMVar store x 
          consume store xs 

उत्तर

24

के बाद से अपने कोड

consume store (x:xs) = putMVar store >> consume store xs 

के बराबर है कॉल वास्तव में पूंछ की स्थिति में नहीं होती है। लेकिन यदि आप ghc -O चलाते हैं और ऑप्टिमाइज़र चालू करते हैं, तो -ddump-simpl विकल्प आपको जीएचसी के इंटरमीडिएट कोड का आउटपुट दिखाएगा, और यह वास्तव में एक पूंछ-रिकर्सिव फ़ंक्शन में अनुकूलित होता है, जो एक लूप में संकलित होगा।

तो उत्तर है कि जीएचसी डिफ़ॉल्ट रूप से इसे अनुकूलित नहीं करेगा; आपको -O विकल्प की आवश्यकता है।

(जीएचसी संस्करण 6.10.1 के साथ किए गए प्रयोग।)

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