की "सख़्ती" मैं एक फ़ाइल में इन परिभाषाओं से रख:वर्ग कोष्ठक
x = 'a' : 'b' : 'c' : []
y = ['a', 'b', 'c']
(क्योंकि बाद के मामले चीजें जिस तरह से अधिक अजीब बन में एक फ़ाइल में उन लोगों के, GHCi में नहीं, परिभाषित करने के लिए महत्वपूर्ण है, । लेकिन यह है कि एक और सवाल)
अब, मैं GHCi में इस फ़ाइल को लोड और है:
λ> :sprint x
x = _
λ> :sprint y
y = _
λ> seq x()
()
λ> seq y()
()
λ> :sprint x
x = 'a' : _
λ> :sprint y
y = "abc"
यहाँ क्या चल रहा है? मैं समझता हूं कि x
के मामले में क्या होता है, यही वही है जो मैंने अपेक्षित था। लेकिन y
के बारे में क्या?
अनुवाद:: निम्नलिखित पहचान रखती है:
[e1, …, ek] = e1 : (e2 : (… (ek : [])))
इसके अलावा:
क्या मैं देख रहा हूँ की रिपोर्ट, जो कहते हैं section 3.7 खंडन करने के लिए लगता है
y = [toUpper 'a', 'b', undefined]
λ> seq y()
()
λ> :sprint y
y = "Ab*** Exception: Prelude.undefined
λ> :sprint y
*** Exception: Prelude.undefined
Char
की सूची के साथ यहां तक कि वास्तविक मूल्यांकन मजबूर किया जाता है है, लेकिन अन्य प्रकार के साथ बातें अभी भी अजीब हैं:
x = True : False : id False : []
y = [True, False, id False]
λ> seq x()
()
λ> seq y()
()
λ> :sprint x
x = True : _
λ> :sprint y
y = [True,False,_]
': स्प्रिंट 'आपको वास्तविक डेटा संरचनाओं पर दृश्यों को पीछे देखने देता है जो आपके डेटा का प्रतिनिधित्व करते हैं। ऐसी कोई आवश्यकता नहीं है कि अर्थात् समकक्ष परिभाषाओं को 'स्प्रिंट' द्वारा प्रदर्शित किया गया हो। (वास्तव में 'स्प्रिंट' का पूरा बिंदु बदलना है क्योंकि एक मूल्य अधिक मूल्यांकन हो जाता है, फिर भी मूल्य प्रक्रिया में नहीं बदलता है!) तो रिपोर्ट के साथ कोई विरोधाभास नहीं है। लेकिन मैं हाथ से नहीं कह सकता कि क्यों ghci 'y' के लिए पूर्व-निर्मित डेटा बनाने के लिए प्रतीत होता है लेकिन' x' नहीं। –
ने कहा, आपके 'y =" अब *** अपवाद में: Prelude.undefined' उदाहरण ऐसा लगता है कि 'स्प्रिंट' खराब व्यवहार करता है। इसे स्ट्रिंग के तत्वों का मूल्यांकन नहीं करना चाहिए। –
@ReidBarton हां, 'स्प्रिंट' और हास्केल रिपोर्ट के बारे में एक अच्छा बिंदु। और ऐसा लगता है कि यह केवल 'चर' (मैंने प्रश्न में एक और उदाहरण जोड़ा है) में तत्वों का मूल्यांकन किया है। – kirelagin