2017-05-12 10 views
7

मेरा एक अच्छा दोस्त एक बार हास्केल में पैटर्न मिलान इस दुर्लभ व्यवहार मेरे लिए दिखायाहास्केल दुर्लभ पैटर्न मिलान

[email protected]"Hello" = s 

परिणाम है:

>s 
>" 

यह स्ट्रिंग मुद्रित करने के लिए शुरू होता है, लेकिन कभी समाप्त होता है, क्या चल रहा है?

उत्तर

8

let एस और = के बाईं ओर सब कुछ शीर्ष स्तर अभिव्यक्ति दायीं तरफ दायरे में है। तो आपने लूपिंग "नीचे" मान बनाया है।

सूचना इस एक ही तरह से व्यवहार करती है:

printString chars = putChar '"' >> mapM_ putChar chars 

क्योंकि chars एक पाश mapM_ putChar chars लटका दिखाई देता है:

Prelude> let s = (s::String) 
Prelude> s 
" 

क्योंकि (सरल बनाने) है कि printString पर करने के लिए कुछ बराबर परिभाषित किया गया है।

+0

के साथ इस अधिक आश्रय का निरीक्षण कर सकते तुम यहाँ कर रहे हैं ... जब इस व्यवहार मैं सच है कि आप ऐसा कर सकते हैं भर में आया था की छानबीन करने की कोशिश की 'चलो 1 = 2' किसी भी परिणाम के बिना । क्या आप इसे समझा सकते हैं? –

+1

@ यूजीन: इसे आलस्य के साथ करना है - जब तक आप मूल्य की जांच नहीं करते हैं, पैटर्न मिलान में असफल होने का मौका नहीं होगा। तो 'x में x @ 1 = 2 को विफल होने दें, जैसा कि' चलो! 1 = 2 में() '। लेकिन '1 = 2 में()' के साथ, कुछ भी हास्केल को वास्तव में अनुरोधित पैटर्न मिलान करने के लिए मजबूर नहीं करेगा। –

+2

@EugeneSh। ओह, कोशिश करें '2 + 2 = 5 में 2 + 2' ... – leftaroundabout

10

@"Hello" यहां अप्रासंगिक है, यह सब String पर प्रकार को ठीक करता है। आप

s :: String 
s = s 

साथ समान व्यवहार कौन सा अर्थ की दृष्टि से

s' :: String 
s' = undefined 

जो परिणाम देता है के बराबर है मिल

Prelude> s' 
"*** Exception: Prelude.undefined 

क्या मैं द्वारा "शब्दार्थ बराबर" मतलब है, दोनों s और s'के नीचे दिए गए मान के उदाहरण हैं, यानी "त्रुटि मानों के पाप बिन किसी भी प्रकार के मान एस, गैर सख्तता के लिए धन्यवाद "। जैसे ही आप नीचे मूल्य डालते हैं, शुद्ध हास्केल भाषा मूल रूप से शक्तिहीन होती है और अपरिभाषित, "अशुद्ध व्यवहार", जैसे आपको हमेशा के लिए प्रतीक्षा करने या अपवाद फेंकने की अनुमति देती है।

हालांकि, फिर से सख्तता के लिए धन्यवाद, यह आवश्यक नहीं है। एक मूल्य मुद्रित करते समय, पहली चीज जो होती है, Show उदाहरण लागू होता है और एक स्ट्रिंग का उत्पादन करने के लिए कहा जाता है। एक हास्केल स्ट्रिंग एक आलसी सूची है। और show स्ट्रिंग " के साथ शुरू होता है, इसलिए यदि स्ट्रिंग स्वयं पूरी तरह से अपरिभाषित है, तो show उस वर्ण का उत्पादन करने में सक्षम होगा।

हम

Prelude> head $ show s 
'"' 
+0

वाह, यह एक आदर्श स्पष्टीकरण है, यहां तक ​​कि मैं इस मुद्दे को थोड़ा और समझ सकता हूं, धन्यवाद बहुत! बड़े स्वामी होने के लिए अच्छा लगा यहाँ चारों ओर लटका –

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