2015-10-16 5 views
15

की "सख़्ती" मैं एक फ़ाइल में इन परिभाषाओं से रख:वर्ग कोष्ठक

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,_] 
+7

': स्प्रिंट 'आपको वास्तविक डेटा संरचनाओं पर दृश्यों को पीछे देखने देता है जो आपके डेटा का प्रतिनिधित्व करते हैं। ऐसी कोई आवश्यकता नहीं है कि अर्थात् समकक्ष परिभाषाओं को 'स्प्रिंट' द्वारा प्रदर्शित किया गया हो। (वास्तव में 'स्प्रिंट' का पूरा बिंदु बदलना है क्योंकि एक मूल्य अधिक मूल्यांकन हो जाता है, फिर भी मूल्य प्रक्रिया में नहीं बदलता है!) तो रिपोर्ट के साथ कोई विरोधाभास नहीं है। लेकिन मैं हाथ से नहीं कह सकता कि क्यों ghci 'y' के लिए पूर्व-निर्मित डेटा बनाने के लिए प्रतीत होता है लेकिन' x' नहीं। –

+2

ने कहा, आपके 'y =" अब *** अपवाद में: Prelude.undefined' उदाहरण ऐसा लगता है कि 'स्प्रिंट' खराब व्यवहार करता है। इसे स्ट्रिंग के तत्वों का मूल्यांकन नहीं करना चाहिए। –

+0

@ReidBarton हां, 'स्प्रिंट' और हास्केल रिपोर्ट के बारे में एक अच्छा बिंदु। और ऐसा लगता है कि यह केवल 'चर' (मैंने प्रश्न में एक और उदाहरण जोड़ा है) में तत्वों का मूल्यांकन किया है। – kirelagin

उत्तर

3

यह सिर्फ करने के लिए सीमित किया जा रहा है sprint। आप undefined बिना छुए तरह

import Control.Exception 

x, y :: String 
x = 'a' : 'b' : undefined : [] 
y = ['a', 'b', undefined] 

main :: IO() 
main = do 
    evaluate x 
    evaluate y 
    putStrLn "Done" 
तो evaluating

दोनों WHNF आय के लिए एक सरल कार्यक्रम लिखते हैं।

मेरा अनुमान है कि कुछ अजीब कारण के लिए GHCi एक स्ट्रिंग है, जो बात यह है कि पूरे y का मूल्यांकन, नहीं seq/evaluate कॉल मजबूर करता है के रूप में x एक सूची के रूप में, लेकिन y मुद्रित करने के लिए फैसला करता है।

+1

ठीक है, ऐसा लगता है कि आप आधे दाएं हैं। यह मूल्यांकन चीज केवल 'चर' की सूचियों के लिए होती है, लेकिन 'स्क्वांट' स्क्वायर ब्रैकेट के साथ अभी भी अजीब तरह से व्यवहार करती है। मैं इसे एक पल में अपना प्रश्न अपडेट करूंगा, यह दिखा रहा हूं। – kirelagin

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