क्योंकि एक newtype
, मोटे तौर पर कहा जाए तो type
तरह रनटाइम पर काम करता है और संकलन समय पर data
की तरह। प्रत्येक data
परिभाषा संकेत की एक अतिरिक्त परत जोड़ती है - जो, सामान्य परिस्थितियों में, एक और विशिष्ट जगह है, जहां किसी थंक के रूप में कुछ छोड़ा जा सकता है - उसके मूल्यों के आस-पास, जबकि newtype
नहीं है। newtype
पर "कन्स्ट्रक्टर" मूल रूप से केवल एक भ्रम है।
कोई भी चीज जो एक में एक से अधिक मान को जोड़ती है, या कि कई मामलों के बीच एक विकल्प देता है, जरूरी अविवेक की एक परत का परिचय है कि व्यक्त करने के लिए है, तो newtype A = A Int Int
की तार्किक व्याख्या "एक साथ उन्हें पकड़" कुछ भी नहीं के साथ दो कट Int
मूल्यों होगा । newtype A = A (Int, Int)
के मामले में अंतर यह है कि ट्यूपल स्वयं संकेतक की अतिरिक्त परत जोड़ता है।
data A = A Int Int
बनाम data A = A (Int, Int)
के साथ इसकी तुलना करें।पूर्व दो परतों (A
कन्स्ट्रक्टर) को दो Int
एस के आस-पास जोड़ता है, जबकि बाद में ट्यूपल के चारों ओर एक ही परत जोड़ता है, जो स्वयं Int
एस के आसपास एक परत जोड़ता है।
संकेतक की प्रत्येक परत भी आम तौर पर एक जगह जोड़ती है जहां कुछ हो सकता है, इसलिए प्रत्येक रूप के लिए संभावित मामलों पर विचार करें, कहां? एक गैर-नीचे मूल्य के लिए खड़ा है:
newtype A = A (Int, Int)
के लिए: ⊥
, (⊥, ?)
, (?, ⊥)
, (?, ?)
data A = A Int Int
के लिए: ⊥
, A ⊥ ?
, A ? ⊥
, A ? ?
data A = A (Int, Int)
के लिए: ⊥
, A ⊥
, A (⊥, ?)
, A (?, ⊥)
, A (?, ?)
जैसा कि आप उपर्युक्त से देख सकते हैं, पहले दो समकक्ष हैं।
एक अंतिम नोट पर, यहाँ कितना newtype
data
से अलग है की एक मजेदार प्रदर्शन है। इन परिभाषाओं पर विचार करें:
data D = D D deriving Show
newtype N = N N deriving Show
क्या संभावित मान, सभी संभव ⊥s सहित, इनमें से प्रत्येक क्या ज़रूरत है? और आपको क्या लगता है कि नीचे दिए गए दो मान होंगे?
d = let (D x) = undefined in show x
n = let (N x) = undefined in show x
उन्हें जीएचसी में लोड करें और पता लगाएं!
क्या आपने [यह] (http://www.haskell.org/haskellwiki/Newtype) पढ़ा है? –
@ एन.एम., लिंक के लिए धन्यवाद, लेकिन क्या आप व्यावहारिक चिंताओं पर विस्तार कर सकते हैं? क्या इसे '(ए _ _)' मिलान के साथ करना है? मुझे समझ में नहीं आता कि ट्यूपल समकक्ष क्यों अनजान व्यवहार का कारण बनता है। – gatoatigrado