2012-11-06 8 views
5

मैं एक Haskell संकलक बहुत चालाक निम्नलिखित परिभाषा अनुकूलन करने के लिए हो सकता है उम्मीद करने में सक्षम होना चाहिए:आंशिक आवेदन और subexpressions एक समारोह के तर्कों के किसी उप सेट पर निर्भर करता है

h x = let z = m x in \y -> p z (n y) 
: कुछ इस तरह में

h x y = p (m x) (n y) 

? यदि m मूल्यांकन करने के लिए महंगे थे यह सुविधाजनक हो सकता है, और मैं निम्नलिखित तरीके से 'h परिभाषा का प्रयोग किया:

main = print $ map (h 2) hugeList 

उत्तर

8

लेकिन क्या होगा अगर m मूल्यांकन करने के लिए सस्ता है, लेकिन इसके परिणाम महंगा स्टोर करने के लिए? के आधार पर m x = [x .. ] और p को उस सूची के विभिन्न उपसर्गों को पार करने की आवश्यकता है। यदि m 2 को map (h 2) hugeList में साझा किया गया है, और किसी भी सूची तत्वों के लिए एक लंबे उपसर्ग की आवश्यकता है, तो आपके पास सभी स्मृति तत्वों को केवल परिणाम को वापस करने के लिए सूची के पहले तत्व की आवश्यकता होती है, भले ही आपके पास बड़ी मेमोरी आवश्यकताएं हों।

तो m x का एक स्वचालित साझाकरण भी निराशाजनक हो सकता है, इसलिए आपको सभी कंपाइलरों को स्वचालित रूप से साझा करने की अपेक्षा नहीं करनी चाहिए।

आम तौर पर, यह तय करना मुश्किल है कि साझाकरण लाभकारी है या यहां तक ​​कि हानिकारक है, इसलिए आपको स्पष्ट रूप से साझा करना चाहिए जहां आप वास्तव में इसे चाहते हैं। (फिर भी, संकलकों को साझा करने की अपेक्षा करें जहां भी आप इसे कभी नहीं चाहते हैं।)

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