मेरे पास एक प्रकार है 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
मुझे किस प्रकार की भूमिकाएँ याद आ रही हैं?
type role
थी कि ऐसा न हो। यह सवाल पूछ रहा है कि काम क्यों नहीं किया।
a
मेंId
एक प्रेत चर है और अंदर वास्तविक मूल्य पर कोई प्रभाव नहीं है। अगर आपके पास होताnewtype Id a = Id a
, तो ज़बरदस्ती विफल हो जाती।