ध्यान दें कि :sprint
है नहीं WHNF को एक अभिव्यक्ति को कम। यदि यह किया जाता है, तो निम्नलिखित इसके 4
बजाय देगा _
:
Prelude> let four = 2 + 2 :: Int
Prelude> :sprint four
four = _
बल्कि, :sprint
एक बंधन का नाम लेता है, बंधन के मूल्य के आंतरिक प्रतिनिधित्व का पता _
लगाता है , और पहले से ही मूल्यांकन किए गए थ्रेश (यानी, निलंबित आलसी फ़ंक्शन ) के लिए एक प्लेसहोल्डर के रूप में उपयोग करते हुए पहले से ही "मूल्यांकन किए गए भागों" (यानी, निर्माण वाले हिस्से) दिखाता है। कॉल)। यदि मान पूरी तरह से अविकसित है, तो कोई मूल्यांकन नहीं किया जाएगा, यहां तक कि WHNF तक भी नहीं। (और यदि मूल्य का पूरी तरह से मूल्यांकन किया जाता है, तो आपको वह मिलेगा, न कि केवल WHNF।)
आप अपने प्रयोगों में जो देख रहे हैं, वह पॉलिमॉर्फिक बनाम मोनोमोर्फिक न्यूमेरिक प्रकारों का एक संयोजन है, स्ट्रिंग शाब्दिक बनाम वर्णों की स्पष्ट सूचियों आदि के लिए अलग-अलग आंतरिक प्रतिनिधित्व। मूल रूप से, आप तकनीकी अंतर देख रहे हैं कि अलग-अलग शाब्दिक अभिव्यक्ति बाइट कोड में कैसे संकलित हैं। इसलिए, इन कार्यान्वयन विवरणों की व्याख्या करना, क्योंकि WHNF के साथ कुछ करने के लिए आपको निराश करने वाला है। आम तौर पर, आपको :sprint
केवल डीबगिंग टूल के रूप में उपयोग करना चाहिए , WHNF और हास्केल मूल्यांकन के शब्दार्थ के बारे में जानने के तरीके के रूप में नहीं।
यदि आप वास्तव में समझना चाहते हैं कि क्या :sprint
कर रहे हैं, तो आप GHCi में कुछ झंडे को चालू कर सकते हैं यह देखने के लिए कि वास्तव में अभिव्यक्ति को कैसे संभाला जा रहा है और, इसलिए, अंततः बायटेकोड के लिए संकलित किया गया है:
> :set -ddump-simpl -dsuppress-all -dsuppress-uniques
इस के बाद, हम कारण अपने को देख सकते हैं intlist
देता है _
:
> let intlist = [[1,2],[2,3]]
==================== Simplified expression ====================
returnIO
(: ((\ @ a $dNum ->
: (: (fromInteger $dNum 1) (: (fromInteger $dNum 2) []))
(: (: (fromInteger $dNum 2) (: (fromInteger $dNum 3) [])) []))
`cast` <Co:10>)
[])
आप returnIO
बाहरी :
कॉल को अनदेखा कर सकते हैं , और उस भाग पर ध्यान केंद्रित कर सकते हैं जो इसके साथ शुरू होता है((\ @ a $dNum -> ...
यहाँ बाधा के $dNum
लिए शब्दकोश है Num
। इसका मतलब यह है कि उत्पन्न कोड ने वास्तविक प्रकार a
को अभी तक हल नहीं किया है Num a => [[a]]
, इसलिए संपूर्ण अभिव्यक्ति को अभी भी एक उपयुक्त Num
प्रकार के लिए एक फ़ंक्शन कॉल (शब्दकोश के लिए) के रूप में दर्शाया गया है । दूसरे शब्दों में, यह एक अनवैलिटेड थंक है, और हमें मिलता है:
> :sprint intlist
_
दूसरी ओर, प्रकार निर्दिष्ट करें Int
, और कोड पूरी तरह से अलग है:
> let intlist = [[1::Int,2],[2,3]]
==================== Simplified expression ====================
returnIO
(: ((: (: (I# 1#) (: (I# 2#) []))
(: (: (I# 2#) (: (I# 3#) [])) []))
`cast` <Co:6>)
[])
और इसलिए :sprint
उत्पादन है:
> :sprint intlist
intlist = [[1,2],[2,3]]
इसी तरह, शाब्दिक तार और पात्रों की स्पष्ट सूची में पूरी तरह से अलग प्रतिनिधित्व है:
> let stringlist = ["hi", "there"]
==================== Simplified expression ====================
returnIO
(: ((: (unpackCString# "hi"#) (: (unpackCString# "there"#) []))
`cast` <Co:6>)
[])
> let charlist = [['h','i'], ['t','h','e','r','e']]
==================== Simplified expression ====================
returnIO
(: ((: (: (C# 'h'#) (: (C# 'i'#) []))
(: (: (C# 't'#)
(: (C# 'h'#) (: (C# 'e'#) (: (C# 'r'#) (: (C# 'e'#) [])))))
[]))
`cast` <Co:6>)
[])
और :sprint
आउटपुट में भिन्नता कलाकृतियों का प्रतिनिधित्व करती है, जो अभिव्यक्ति के कुछ हिस्सों में GHCi मूल्यांकन किए गए (स्पष्ट :
कंस्ट्रक्टर) बनाम unpackCString#
अनवैल्युएटेड ( थ्रक्स) मानते हैं।