আমার একটি প্রকার রয়েছে 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
, তবে জবরদস্তি ব্যর্থ হত।