ভূমিকা and coused` দ্বারা বিভ্রান্তিকর আচরণ এবং টাইপ করুন `


11

আমার একটি প্রকার রয়েছে 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

টাইপ ভূমিকা সম্পর্কে আমি কি অনুপস্থিত?


aইন Idএকটি ফ্যান্টম ভেরিয়েবল এবং ভিতরে প্রকৃত মানের উপর কোনও প্রভাব রাখে না। যদি আপনার থাকে newtype Id a = Id a, তবে জবরদস্তি ব্যর্থ হত।
লেহিন্স

@ এলাহিন্সের বিষয়টি এমনটি type roleহওয়া উচিত নয়। এই প্রশ্নটি কেন কাজ করে না তা জিজ্ঞাসা করছে।
জোসেফ সিবল-রিইনস্টেট মনিকা

উত্তর:


12

Coercibleতিনটি সম্ভাব্য "প্রকারের" উদাহরণ রয়েছে (যা স্বয়ংক্রিয়ভাবে সংকলক দ্বারা উত্পাদিত হয়, ব্যবহারকারী দ্বারা সংজ্ঞায়িত করা হয় না)। এর মধ্যে কেবল একটিই ভূমিকা দ্বারা প্রভাবিত হয় ।

  • প্রতিটি প্রকারের নিজের কাছে প্রচ্ছন্ন।
  • আপনি প্রদান করেছেন ক্ষতিগ্রস্ত টাইপ ভেরিয়েবল, "অধীনে" একটি টাইপ কন্সট্রাকটর নিগৃহীত করতে representationalবা phantom। উদাহরণস্বরূপ, যদি আপনি একটি নিগৃহীত করতে Map Char Intএকটি মধ্যে Map Char (Data.Monoid.Sum Int)কারণ জন্য Mapআমরা আছে type role Map nominal representational
  • অন্তর্নিহিত টাইপটিতে আপনি সর্বদা একটি নতুন টাইপকে জোর করতে পারেন এবং বিপরীতভাবে, নতুন প্রকারের নির্মাণকারীর সুযোগ থাকে provided এটি সমস্ত ভূমিকা উপেক্ষা করে! যুক্তিটি হ'ল, কনস্ট্রাক্টর উপলভ্য হওয়ার কারণে আপনি সর্বদা ম্যানুয়ালি মোড়ানো এবং আন-মোড়ানো করতে পারেন, সুতরাং ভূমিকাটি আপনাকে কোনও সুরক্ষা দেয় না।

আপনার উদাহরণে, তৃতীয় বিধি প্রযোজ্য। যদি নতুন প্রকারটি অন্য মডিউলে সংজ্ঞায়িত করা হয় এবং কনস্ট্রাক্টর আমদানি না করা হয়, তবে জবরদস্তি ব্যর্থ হত (এটিকে আবার কাজ করার জন্য, আপনাকে ভূমিকাটি স্যুইচ করতে হবে phantom)।

নতুন টাইপগুলির জন্য কিছুটা অবাক করা বিশেষ আচরণের এই জিএইচসি ইস্যুতে ব্যাখ্যা করা হয়েছে ।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.