टाइप भूमिकाएँ और भ्रमित व्यवहार `मोटे` द्वारा


11

मेरे पास एक प्रकार है Id aऔर मैं गलती से जोर-जबरदस्ती को रोकने की कोशिश कर रहा हूं, जैसे, a Id Doubleसे a Id Int

यदि मैं टाइप रोल्स को सही तरीके से समझता हूं, तो निम्नलिखित को संकलित नहीं करना चाहिए।

{-# LANGUAGE RoleAnnotations #-}
import Data.Coerce (coerce)

type role Id nominal
newtype Id a = Id String

badKey :: Id Int
badKey = coerce (Id "I point to a Double" :: Id Double)

दुर्भाग्य से, यह करता है:

Prelude> :load Id.hs
[1 of 1] Compiling Main             ( Id.hs, interpreted )
Ok, one module loaded.
*Main> :type badKey
badKey :: Id Int

मुझे किस प्रकार की भूमिकाएँ याद आ रही हैं?


aमें Idएक प्रेत चर है और अंदर वास्तविक मूल्य पर कोई प्रभाव नहीं है। अगर आपके पास होता newtype Id a = Id a, तो ज़बरदस्ती विफल हो जाती।
लेहिंस

@lehins की बात यह type roleथी कि ऐसा न हो। यह सवाल पूछ रहा है कि काम क्यों नहीं किया।
जोसेफ सिबल-पुनः मोनिका

जवाबों:


12

Coercibleउदाहरणों के तीन संभावित "प्रकार" हैं (जो संकलक द्वारा स्वचालित रूप से उत्पन्न होते हैं, उपयोगकर्ता द्वारा परिभाषित नहीं)। उनमें से केवल एक ही वास्तव में भूमिकाओं से प्रभावित होता है ।

  • हर प्रकार अपने आप में एक जैसा है।
  • आप एक प्रकार के निर्माणकर्ता के तहत "जोर-जबरदस्ती" कर सकते हैं, बशर्ते कि प्रभावित प्रकार चर हों representationalया phantom। उदाहरण के लिए, आप हमारे लिए Map Char Intएक Map Char (Data.Monoid.Sum Int)कारण बन सकते Mapहैं type role Map nominal representational
  • आप हमेशा अंतर्निहित प्रकार और इसके विपरीत में एक नया टाइप करने के लिए बाध्य कर सकते हैं, बशर्ते कि नया टाइप निर्माता कार्यक्षेत्र में हो। यह सभी भूमिकाओं की अनदेखी करता है! तर्क यह है कि, यह देखते हुए कि कंस्ट्रक्टर उपलब्ध है, आप हमेशा लपेट सकते हैं और मैन्युअल रूप से खोल सकते हैं, इसलिए भूमिका आपको किसी भी तरह से कोई सुरक्षा नहीं देती है।

आपके उदाहरण में, तीसरा नियम लागू होता है। यदि न्यूटाइप को किसी अन्य मॉड्यूल में परिभाषित किया गया था और निर्माणकर्ता आयात नहीं किया गया था, तो जबरदस्ती विफल हो जाएगी (इसे फिर से काम करने के लिए, आपको भूमिका को स्विच करना होगा phantom)।

इस GHC मुद्दे में न्यूटाइप्स के लिए कुछ आश्चर्यजनक विशेष व्यवहार को समझाया गया है ।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.