मैं हैकेल में आलसी मूल्यांकन के बारे में पढ़ रहा हूं और एक प्रश्न है। उदाहरण के लिए हम निम्नलिखित संगणना है:डेटा संरचनाओं के आलसी मूल्यांकन
Prelude> let x = 1 + 1 :: Int
Prelude> let y = (x,x)
और x
का मूल्य प्राप्त करने के बाद:
Prelude> :sprint x
x = _
यह unevaluated है। ठीक है, अब हम y के मूल्य मिलता है:
Prelude> :sprint y
y = (_,_)
यह बहुत unevaluated है, क्योंकि y
x and it's unevaluated
पर निर्भर करता है। अब हम एक ही उदाहरण लेकिन ::Int
बिना की कोशिश करते हैं:
Prelude> let x = 1 + 1
Prelude> let y = (x, x)
Prelude> :sprint y
y = _
क्यों y
मूल्य _
बजाय (_, _)
है जब हम ::Int
बिना कोशिश कर रहे हैं?
मैं देख रहा हूँ कि वे विभिन्न प्रकार है:
Prelude> let x = 1 + 1
Prelude> :t x
x :: Num a => a
Prelude> let x = 1 + 1 :: Int
Prelude> :t x
x :: Int
लेकिन क्यों y
के मूल्यों पर निर्भर?
धन्यवाद।
अब वास्तव में मजेदार भाग के लिए, 'x' होने के प्रकार' Num a => a' के साथ, आप 'x' और 'y' दोनों का पूर्ण मूल्यांकन करने के बाद क्या होता है? उनके 'स्प्रिंट' प्रतिनिधित्व का क्या होता है? – bheklilr
@bheklilr, हाँ, बहुत रोचक। मैंने बनाया: 'x' और' y' के लिए 'seq', वे मान प्रिंट करते हैं, लेकिन: स्प्रिंट प्रिंट्स' _' – 0xAX
इसका प्रकार "x" का मूल्यांकन करने का भी अर्थ है जब इसका प्रकार 'Num a => a' है ? संकलक कैसे जानता है कि इसके साथ क्या करना है? यह कहने में सक्षम कैसे है कि 'x' का मान '2' है जब यह नहीं पता कि' + 'का उपयोग करने के लिए कौन सा कार्यान्वयन है? मैं 'Int' के आस-पास अपना खुद का नया प्रकार कार्यान्वित कर सकता हूं जिसे '(MyInt x) + (MyInt y) = MyInt (x-y)' के रूप में परिभाषित किया गया है, तो जीएचसी क्या कर रहा है ताकि वह 'x' प्रिंट करने में सक्षम हो सके। 'मूल्य' 2' है? – bheklilr