एक्स पहली परिभाषा में x को ठीक करने का अर्थ कैसे आता है?
fix f = let x = f x in x
चलो हास्केल में बाइंडिंग हैं पुनरावर्ती
सबसे पहले, पता है कि हास्केल पुनरावर्ती लेट बाइंडिंग अनुमति देता है। हास्केल ने "चलो" क्या कहा, कुछ अन्य भाषाएं "लेट्रेक" कहती हैं। यह फ़ंक्शन परिभाषाओं के लिए बहुत सामान्य लगता है। उदाहरण के लिए:
ghci> let fac n = if n == 0 then 1 else n * fac (n - 1) in fac 5
120
लेकिन यह मूल्य परिभाषाओं के लिए बहुत अजीब लग सकता है। फिर भी, हास्केल की गैर-कठोरता के कारण मूल्यों को पुन: परिभाषित किया जा सकता है।
ghci> take 5 (let ones = 1 : ones in ones)
[1,1,1,1,1]
हास्केल के आलस्य के बारे में अधिक विस्तार के लिए A gentle introduction to Haskell वर्गों 3.3 और 3.4 देखें। एक वादा गणना प्रदर्शन करने के लिए:
Thunks GHC
GHC में, एक रूप में अभी तक unevaluated अभिव्यक्ति एक "thunk" में लपेटा जाता है। Thunks का मूल्यांकन केवल तभी किया जाता है जब वे बिल्कुल होना चाहिए। मान लीजिए कि हम fix someFunction
चाहते हैं। fix
की परिभाषा के अनुसार, कि
let x = someFunction x in x
अब, क्या GHC देखता है कुछ इस तरह है।
let x = MAKE A THUNK in x
तो यह खुशी से आप के लिए एक thunk बना देता है और जब तक आप को पता है कि x
वास्तव में है की मांग सही साथ ले जाता है।
नमूना मूल्यांकन
thunk की अभिव्यक्ति सिर्फ खुद को संदर्भित करने के लिए होता है। आइए ones
उदाहरण लें और fix
का उपयोग करने के लिए इसे फिर से लिखें।
ghci> take 5 (let ones recur = 1 : recur in fix ones)
[1,1,1,1,1]
तो यह थंक कैसा दिखता है?
हम एक स्पष्ट प्रदर्शन के लिए अज्ञात फ़ंक्शन \recur -> 1 : recur
के रूप में ones
इनलाइन कर सकते हैं।
take 5 (fix (\recur -> 1 : recur))
-- expand definition of fix
take 5 (let x = (\recur -> 1 : recur) x in x)
अब तो, क्या x
है? ठीक है, भले ही हम काफी यकीन है कि क्या x
है नहीं कर रहे हैं, हम अभी भी के माध्यम से समारोह आवेदन के साथ जा सकते हैं:
take 5 (let x = 1 : x in x)
अरे देखो, हम परिभाषा हम पहले था पर वापस आ गए हैं।
take 5 (let ones = 1 : ones in ones)
तो अगर आपको लगता है कि आप समझते हैं कि कि एक काम करता है, तो आप कैसे fix
काम करता है की एक अच्छी लग रहा है।
कोई लाभ दूसरा पहले ओवर परिभाषा का उपयोग करने के लिए है?
हां। समस्या यह है कि दूसरा संस्करण अनुकूलन के साथ भी स्पेस लीक का कारण बन सकता है। forever
की परिभाषा के साथ एक ही समस्या के लिए GHC trac ticket #5205 देखें। यही कारण है कि मैंने थंक्स का उल्लेख किया: क्योंकि let x = f x in x
केवल एक थंक आवंटित करता है: x
थंक।
पहली परिभाषा अधिक कुशल है क्योंकि यह गाँठ से जुड़ा हुआ है। उदाहरण के लिए, 'fix1 (1 :) !! की तुलना करें !! 1000000' और 'फिक्स 2 (1 :) !! 1000000'। – is7s
'गठबंधन संबंध' का क्या अर्थ है? क्या आप मुझे एक लिंक पर इंगित कर सकते हैं? –
@ वैन्सन सैमुएल http://www.haskell.org/haskellwiki/Tying_the_Knot –