2016-02-04 6 views
10
Prelude> let a = 3 
Prelude> :sprint a 
a = _ 
Prelude> let c = "ab" 
Prelude> :sprint c 
c = _ 

यह हमेशा _ क्यों प्रिंट करता है? मुझे कमांड के अर्थशास्त्र नहीं मिलते हैं।क्यों: स्प्रिंट हमेशा एक "_" प्रिंट करता है?

+0

कोशिश 'seq सी()' के बाद: ': स्प्रिंट c' दे देंगे आप' ग = 'ए': _' ... आपके पिछले प्रश्न – Carsten

उत्तर

10

हास्केल एक आलसी भाषा है। यह तब तक परिणामों का मूल्यांकन नहीं करता जब तक वे "आवश्यक" न हों।

अब, प्रिंटिंग एक मूल्य यह सब "आवश्यक" होने का कारण बनता है। दूसरे शब्दों में, यदि आप जीएचसीआई में एक अभिव्यक्ति टाइप करते हैं, तो यह परिणाम प्रिंट करने का प्रयास करेगा, जिसके कारण इसका मूल्यांकन किया जा सकता है। आमतौर पर यही वही है जो आप चाहते हैं।

sprint कमांड (जो एक जीएचसीआई सुविधा है, जो हास्केल भाषा का हिस्सा नहीं है) आपको यह देखने की अनुमति देता है कि इस बिंदु पर कितना मूल्य मूल्यांकन किया गया है।

उदाहरण के लिए:

Prelude> let xs = [1..] 
Prelude> :sprint xs 
xs = _ 

तो, हम सिर्फ xs की घोषणा की, और यह वर्तमान में unevaluated है। आइए पहले तत्व को प्रिंट करें:

Prelude> head xs 
1 
Prelude> :sprint xs 
xs = 1 : _ 

अब जीएचसीआई ने सूची के प्रमुख का मूल्यांकन किया है, लेकिन कुछ भी नहीं।

Prelude> take 10 xs 
[1,2,3,4,5,6,7,8,9,10] 
Prelude> :sprint xs 
xs = 1 : 2 : 3 : 4 : 5 : 6 : 7 : 8 : 9 : 10 : _ 

अब पहले 10 तत्वों का मूल्यांकन किया जाता है, लेकिन अधिक रहते हैं। (xs के बाद से एक अनंत सूची है, कि आश्चर्य की बात नहीं है।)

आप अन्य भाव का निर्माण और देखने के लिए क्या हो रहा है एक समय में उन्हें थोड़ा मूल्यांकन कर सकते हैं। यह वास्तव में जीएचसीआई डीबगर का हिस्सा है, जो आपको एक समय में अपने कोड को एक बिट से आगे बढ़ने देता है। विशेष रूप से यदि आपका कोड एक अनंत लूप में पकड़ा जा रहा है, तो आप print कुछ भी नहीं चाहते हैं, क्योंकि इससे जीएचसीआई लॉक हो सकता है। लेकिन आप अभी भी देखना चाहते हैं कि क्या हो रहा है ... इसलिए sprint, जो आपको यह देखने देता है कि अब तक क्या मूल्यांकन किया गया है।

+10

टिप्पणी: चूंकि '[1 ..]' में एक पॉलिमॉर्फिक प्रकार है, इसलिए यह संभव है कि 'sp xs'' _' 'उत्पन्न होता है, यहां तक ​​कि' head xs' के बाद भी। 'xs = [1 ..] :: [इंटीजर]' इसे ठीक कर देगा। – Zeta

6

हास्केल आलसी है। यह तब तक चीजों का मूल्यांकन नहीं करता जब तक उनकी आवश्यकता न हो।

जीएचसीआई sprint कमांड (हास्केल का हिस्सा नहीं, केवल दुभाषिया का डिबगिंग कमांड) मूल्यांकन को मजबूर किए बिना अभिव्यक्ति के मूल्य को प्रिंट करता है।

जब आप

let a = 3 

बारे में आप दाएँ हाथ की ओर अभिव्यक्ति के लिए एक नया नाम a बाध्य है, लेकिन अभी तक हास्केल उस चीज़ का मूल्यांकन नहीं होंगे। इसलिए, जब आप sprint करते हैं, तो यह _ प्रिंट करता है यह दर्शाता है कि अभिव्यक्ति का अभी तक मूल्यांकन नहीं हुआ है।

इस प्रयास करें:

let a = 3 
:sprint a -- a has not been evaluated yet 
print a -- forces evaluation of a 
:sprint a -- now a has been evaluated 
+9

में पोस्ट किए गए लिंक को भी पढ़ें, 'ए = 3' यह अधिक जटिल है (आपको यह कोशिश करनी चाहिए) - डिफ़ॉल्ट रूप से' ए ''a :: संख्या होगी => ए' और आपके मामले में हमेशा 'स्प्रिंट'' _' होगा - आईएमओ 'स्ट्रिंग' उदाहरण इस – Carsten

+5

के लिए एक महसूस करने के लिए बेहतर है यदि आप 'ए = 3'' का उपयोग करते हैं, तो आप बेहतर प्रकार निर्दिष्ट करते हैं 'एक = 3 :: Int' दें ताकि आप उलझन में नहीं आ जाएंगे, यह भी ध्यान दें कि पुराने संस्करणों में जीएचसी 7.8 में यह व्यवहार बदल गया है, आपको इस कथन में टाइप लिखने की ज़रूरत नहीं है' स्प्रिंट 'काम जैसा सोचा था'। – epsilonhalbe

3

मैं देर से एक सा है, लेकिन मैं एक ऐसी ही समस्या हुई:

λ: let xs = [1,2,3] 
xs :: Num t => [t] 
λ: :sprint xs 
xs = _ 
λ: print xs 
λ: :sprint xs 
xs = _ 

यह समस्या बहुरूपी मूल्यों के लिए विशिष्ट है।आप -XNoMonomorphismRestriction सक्षम GHCi है, तो वास्तव में मूल्यांकन कभी नहीं होगा/बल xs, यह केवल का मूल्यांकन करेंगे/बल विशेषज्ञताओं:

λ: :set -XMonomorphismRestriction 
λ: let xs = [1,2,3] 
xs :: [Integer] 
λ: print xs 
λ: :sprint xs 
xs = [1,2,3] 
+2

ध्यान दें कि यह केवल "अधिभारित" मानों पर लागू होता है जैसे 'xs'; चीजें जिनके पास चर के साथ एक प्रकार है और उन चर पर वर्ग वर्ग की बाधाएं हैं। यह ज्यादातर उदाहरण हैं जिनमें शाब्दिक संख्याएं शामिल हैं जो इस तरह से व्यवहार करती हैं; दुर्भाग्यवश संख्या सीखने के दौरान चारों ओर खेलने के लिए स्पष्ट चीजें हैं। यदि आप इसके बजाय बुलियन ('ट्रू', 'गलत', '&&', 'और', आदि) के साथ खेलते हैं तो सबकुछ अधिकतर' नोमोनोमोर्फिज्म रेस्ट्रिक्शन 'या चाहे आप एक स्पष्ट प्रकार के हस्ताक्षर के बावजूद व्यवहार करते हैं। – Ben

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