2012-12-02 10 views
8

चूंकि newtype एस संकलन के दौरान प्रभावी रूप से हटा दिए जाते हैं, उनके पास थंक्स नहीं होते हैं, केवल मूल्य होते हैं। तो अगर मैं rseq का उपयोग कर अपने डब्ल्यूएचएनएफ के लिए पूछता हूं तो क्या होता है?एक नया प्रकार का डब्ल्यूएचएनएफ क्या है और आरएसईसी एक नए प्रकार पर कैसे काम करता है?

Sum (lengthyComputation :: Int) `using` rseq 

में उदाहरण के लिए जहां SumlengthyComputation या मूल्यांकन नहीं हो जाएगी

newtype Sum a = Sum { getSum :: a } 

के रूप में परिभाषित किया गया है? क्या यह कहीं निर्दिष्ट/दस्तावेज है ताकि मैं उस पर भरोसा कर सकूं?


अद्यतन: मुझे और अधिक विस्तार से मेरी संदेह समझाता हूँ। सहजता से एक कहता है: "newtype इतना सख्ती से स्पष्ट है कि डब्ल्यूएचएनएफ डब्ल्यूएचएनएफ है जो अंदर लपेटा गया है"। लेकिन मुझे लगता है कि यह एक बहुत ही कम शॉर्टकट है और तर्क इतना स्पष्ट नहीं है। मुझे एक उदाहरण दें:

मानक data प्रकारों के लिए, डब्ल्यूएचएनएफ को एक रूप के रूप में परिभाषित किया जा सकता है जहां हम जानते हैं कि मूल्य बनाने के लिए किस कन्स्ट्रक्टर का उपयोग किया गया था। , उदाहरण के लिए, हम seq नहीं था, हम बना सकते हैं हमारे अपने

seqMaybe :: Maybe a -> b -> b 
seqMaybe Nothing = id 
seqMaybe _  = id 

और इसी तरह किसी भी data प्रकार के लिए, बस इसके निर्माताओं में से एक पर मिलान पैटर्न से।

अब

newtype Identity a = Identity { runIdentity :: a } 

लेने के लिए और एक समान seqIdentity समारोह बना सकते हैं:

seqIdentity :: Identity a -> b -> b 
seqIdentity (Identity _) = id 

स्पष्ट रूप से, कुछ भी नहीं यहाँ WHNF करने के लिए मजबूर कर रहा है। (आखिरकार, हम हमेशा जानते हैं कि कन्स्ट्रक्टर का उपयोग किया गया था।) संकलन के बाद, seqIdentityconst id के समान होगा। वास्तव में, पॉलीमोर्फिक seqIdentity बनाना संभव नहीं है कि यह Identity के अंदर लिपटे मान के मूल्यांकन को मजबूर करेगा! हम डब्ल्यूएचएनएफ को newtype में से एक को केवल अनमोडिफाइड मानने के लिए परिभाषित कर सकते हैं, और यह लगातार होगा। तो मेरा मानना ​​है कि सवाल यह है कि डब्ल्यूएचएनएफ ने newtype एस के लिए कैसे परिभाषित किया है? या क्या कोई कठोर परिभाषा नहीं है, और व्यवहार "यह अंदर की चीज़ों का डब्ल्यूएचएनएफ" है जिसे बस कुछ स्पष्ट माना जाता है?

उत्तर

8

रिपोर्ट में Datatype renamings पर विभाग के अनुसार,

बीजीय डेटाटाइप्स के विपरीत, newtype निर्माता एन unlifted है, ताकि एन ⊥ ⊥ के समान है।

यहाँ

Sum ⊥ = ⊥ 

इतना कमजोर सिर एक newtype की सामान्य रूप लिपटे प्रकार के WHNF है, और

Sum (lengthyComputation :: Int) `using` rseq 

का मूल्यांकन करता है lengthyComputation (जब पूरा अभिव्यक्ति मूल्यांकन किया जाता है, एक केवल बाध्यकारी

let x = Sum (lengthyComputation :: Int) `using` rseq 

निश्चित रूप से नहीं है, लेकिन यह नए प्रकार के कन्स्ट्रक्टर के बिना समान है)।

seq ⊥ b = ⊥ 
seq a b = b, if a ≠ ⊥ 

और इसलिए

seq (Sum ⊥) b = ⊥ 

और

seq (lengthyComputaton :: Int) b 

seq में हैं defining equationsseq के लिए lengthyComputation :: Int है कि क्या पता लगाने के लिए (अवतारवाद के लिए खेद है) की आवश्यकता है ⊥ या एन OT। ऐसा करने के लिए, इसे lengthyComputation :: Int का मूल्यांकन करना होगा।


पुन अद्यतन:

newtype रों unlifted कर रहे हैं, कि इसका मतलब है कि निर्माता एक मूल्य के निर्माता शब्दार्थ (केवल वाक्य रचना) नहीं है। newtype कन्स्ट्रक्टर पर पैटर्न-मिलान, data कन्स्ट्रक्टर पर पैटर्न पैटर्न के विपरीत सख्त नहीं है। यह देखते हुए

newtype Foo a = Foo { unFoo :: a } -- record syntax for convenience below 

एक "पैटर्न मैच"

function :: Foo a -> Bar 
function (Foo x) = whatever x 

पूरी तरह से

function y = let x = unFoo y in whatever x 

मैचों में हमेशा सफल होता है के बराबर है, और कुछ भी मूल्यांकन करता है। The constructor only coerces the type और "पैटर्न मिलान" उस पर मूल्य के प्रकार को सह-सहकारित करता है।

seq जादू है, इसे हास्केल में लागू नहीं किया जा सकता है। data प्रकार के लिए seq जैसा किऊपर, हस्केल में, लेकिन एक (पॉलिमॉर्फिक) newtype के लिए नहीं है, क्योंकि न्यूटाइप कन्स्ट्रक्टर पर "पैटर्न मिलान" सख्त नहीं है। आपको लपेटा प्रकार के निर्माता (ओं) पर मिलान करना होगा, लेकिन एक पॉलिमॉर्फिक newtype के लिए, आपके पास नहीं है।

+0

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

+2

यह नहीं है कि 'न्यूटाइप सख्त हैं, यह है कि वे _unlifted_ हैं जो डब्ल्यूएचएनएफ प्रचारित करता है। –

+0

विस्तृत उत्तर, क्या यह और अधिक स्पष्ट करता है? –

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