क्या जीएचसी को किसी विशेष मूल्य के जीवनकाल के लिए विशेष गणना करने के लिए मजबूर करने का कोई तरीका है?क्या हास्केल में कोई अंतर्निहित-आश याद है?
मैं स्पष्ट रूप से मूल्य को रिकॉर्ड में रख सकता हूं, जो गणना गणना के परिणाम के लिए आलसी रिकॉर्ड प्रविष्टियां बना सकता है, और एक निर्माता फ़ंक्शन बनाता है जो रिकॉर्ड बनाता है और कहा गया प्रविष्टियों में मूल्य को थंक करता है।
मुझे हर बार रिकॉर्ड से मूल मूल्य को खींचने की आवश्यकता से नफरत होगी। और हास्केल का कोई स्पष्ट रूप से पॉलीमोर्फिक नहीं है-सी ++ या जावा जैसे रिश्तों।
समान पैरामीटर वाले फ़ंक्शन के एकाधिक असंबद्ध आमंत्रणों में मानों को याद करने के लिए कोई चाल है?
मैं भरोसेमंद प्रकार के रूपों के साथ विभिन्न चालों की कल्पना कर सकता हूं जो प्रभावी रूप से संकलक को एकाधिक उपयोग आ रहे थे। हास्केल में कोई निर्भर प्रकार नहीं है लेकिन शायद अंतर्निहित पैरामीटर के आसपास कुछ है? मुझे नहीं लगता, लेकिन मैंने सोचा कि मैं पूछूंगा। शायद एक प्रज्ञा?
कल्पना कीजिए मैं Necklace
डेटा संरचनाओं है जिसके लिए मैं परिमेय संख्याओं के एक परिणामस्वरूप वेक्टर, एक आम भाजक और अंश का एक वेक्टर के रूप में जमा की जरूरत का एक वेक्टर है।
{-# LANGUAGE ImplicitParams #-}
import qualified Data.Vector as V
data Necklace = Necklace { ... }
necklace_length n = ...
denominator :: (necklaces :: V.Vector Necklace) => Int
denominator = V.foldl' lcm 30 $ V.map necklace_length ?necklaces
numerators :: (necklaces :: V.Vector Necklace) => V.Vector Int
numerators = V.map f ?necklaces
where f x = ... denominator ...
kittytoy :: (necklaces :: V.Vector Necklace) => Meow -> ...
kittytoy = \meow -> ... numerators ...
एक प्रायोरी, मुझे लगता है कि उम्मीद थी, अगर मैं कई लाख kittytoy
बार, हर आह्वान एक अलग पैरामीटर meow
साथ, तो GHC कोड कि numerators
एक लाख गुना, प्रत्येक का आह्वान एक समान निहित मापदंडों necklaces
साथ पैदा करता है।
यह फिर भी स्पष्ट है कि numerators
केवल एक बार लागू होने की आवश्यकता है, पहली बार ?necklaces
असाइन किया जाता है, जिसका अर्थ है कि जीएचसी संभावित रूप से इस अनुकूलन को देख सकता है।
टेम्पलेट हैकेल का उपयोग करके स्पष्ट कोड रिफैक्टरिंग दृष्टिकोण भी होना चाहिए ताकि ?numerators = numerators
जैसे कोड का उत्पादन करके थंक्स को स्पष्ट रूप से पास किया जा सके और इसे कॉल करने वाले कार्यों की बाधाओं को टाइप करने के लिए numerators :: V.Vector Int
जोड़ना चाहिए।
'kittytoy necklaces = n = numerators \ meow में हार -> सामग्री' निश्चित रूप से' n' को याद रखना चाहिए। यकीन नहीं है कि यह भी इस तरह से होगा। – yairchu
क्या आपका मतलब है 'चलो k = kittytoy ...' 'k' के साथ प्रत्येक कॉल को' kittytoy' में बदल रहा है? हां, मैं सहमत हूं कि अंतर्निहित पैरामीटर 'हार' को याद रखना चाहिए, लेकिन क्या मुझे वास्तव में ऐसा करने की ज़रूरत है? –
आह, नहीं, मैं 'kittertoy 'पर कॉल के बाहर' संख्याकार * * को याद करने की कोशिश कर रहा हूं, क्योंकि' किट्टीटोई 'को कई मिलियन बार बुलाया जाता है। हां, यह एक वैध बिंदु है कि 'kittytoy' को लैम्ब्डा अभिव्यक्ति होना चाहिए, भले ही मैं इसे स्पष्टता के लिए संपादित करूं। –