আমার একটি প্রকার রয়েছে Id aএবং আমি দুর্ঘটনাক্রমে জোর দেওয়া বন্ধ করতে চেষ্টা করছি, যেমন, একটি Id Doubleথেকে একটি 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, তবে জবরদস্তি ব্যর্থ হত।