উচ্চ স্তরের প্যারামিট্রিক বহুবর্ষটি কি কার্যকর?


16

আমি নিশ্চিত যে প্রত্যেকে ফর্মের জেনেরিক পদ্ধতিগুলির সাথে পরিচিত:

T DoSomething<T>(T item)

এই ফাংশনটিকে প্যারামেট্রিকલી পলিমর্ফিক (পিপি) বলা হয়, বিশেষত র‌্যাঙ্ক -১ পিপি।

ধরা যাক এই পদ্ধতিটি ফর্মের কোনও ফাংশন অবজেক্ট ব্যবহার করে প্রতিনিধিত্ব করা যেতে পারে:

<T> : T -> T

এর <T>অর্থ, এটি এক ধরণের প্যারামিটার নেয় এবং এর T -> Tঅর্থ এটি এক ধরণের পরামিতি নেয় Tএবং একই ধরণের মান প্রদান করে।

তারপরে নিম্নলিখিতটি র‌্যাঙ্ক -2 পিপি ফাংশন হবে:

(<T> : T -> T) -> int 

ফাংশনটি কোনও ধরণের প্যারামিটার নিজেই নেয় না, তবে একটি ফাংশন নেয় যা একটি ধরণের পরামিতি নেয়। আপনি এই পুনরাবৃত্তভাবে চালিয়ে যেতে পারেন, নীড়গুলি আরও গভীর এবং আরও গভীর করে তুলুন, উচ্চতর এবং উচ্চতর র‌্যাঙ্কের পিপি পাচ্ছেন।

প্রোগ্রামিং ভাষার মধ্যে এই বৈশিষ্ট্যটি সত্যিই বিরল। এমনকি হাস্কেল এটি ডিফল্টরূপে অনুমতি দেয় না।

এটা কি দরকারী? এটি অন্যথায় বর্ণনা করা কঠিন যে আচরণগুলি বর্ণনা করতে পারে?

এছাড়াও, এটা কি কিছু মানে হতে নেই impredicative ? (এই প্রসঙ্গে)


1
মজার বিষয় হল, টাইপস্ক্রিপ্ট সম্পূর্ণ র‌্যাঙ্ক-এন পিপি সমর্থন সহ একটি মূলধারার ভাষা। উদাহরণস্বরূপ, নিম্নলিখিতটি বৈধ টাইপস্ক্রিপ্ট কোড:let sdff = (g : (f : <T> (e : T) => void) => void) => {}
গ্রেগরোস

উত্তর:


11

সাধারণভাবে, আপনি যখন কলি চান তখন কলারের পরিবর্তে কোনও প্রকারের প্যারামিটারের মানটি নির্বাচন করতে সক্ষম হন আপনি উচ্চ-স্তরের বহুবচন ব্যবহার করেন । উদাহরণ স্বরূপ:

f :: (forall a. Show a => a -> Int) -> (Int, Int)
f g = (g "one", g 2)

কোন ফাংশন gযে আমি এই পাস fআমাকে একটি দিতে সক্ষম হওয়া আবশ্যক Intকিছু টাইপ, যেখানে একটি মান থেকে শুধুমাত্র জিনিস gযে টাইপ বিষয়ে জানেন এটি একটি দৃষ্টান্ত রয়েছে Show। সুতরাং এগুলি কোশার:

f (length . show)
f (const 42)

তবে এগুলি নয়:

f length
f succ

একটি বিশেষ উপকারী অ্যাপ্লিকেশন হ'ল মূল্যগুলির স্কোপিং প্রয়োগ করার জন্য ধরণের স্কোপিং ব্যবহার করা । মনে করুন আমাদের কাছে কোনও ধরণের অবজেক্ট রয়েছে , এমন কোনও ক্রিয়া প্রতিনিধিত্ব করে যা আমরা ভবিষ্যতের বা কলব্যাকের মতো ধরণের ফলাফল তৈরি করতে চালাতে পারি ।Action<T>T

T runAction<T>(Action<T>)

runAction :: forall a. Action a -> a

এখন, ধরুন যে আমাদের কাছে এমন একটি রয়েছে Actionযা Resource<T>বস্তু বরাদ্দ করতে পারে:

Action<Resource<T>> newResource<T>(T)

newResource :: forall a. a -> Action (Resource a)

আমরা প্রয়োগ করতে চাই যে এই সংস্থানগুলি কেবলAction যেখানে তৈরি করা হয়েছিল সেখানেই ব্যবহার করা হয়েছে এবং একই ক্রিয়াকলাপের বিভিন্ন ক্রিয়াকলাপ বা বিভিন্ন রানের মধ্যে ভাগ করা হয়নি, যাতে ক্রিয়াগুলি নির্বিচারক এবং পুনরাবৃত্তিযোগ্য হয়।

আমরা এটি সম্পাদন করতে উচ্চ-র‌্যাঙ্কড প্রকারগুলি ব্যবহার করতে পারি এবং প্রকারগুলিতে একটি পরামিতি যুক্ত Sকরে এটি সম্পূর্ণ বিমূর্ত - এটি "স্কোপ "টির প্রতিনিধিত্ব করে । এখন আমাদের স্বাক্ষরগুলি হ'ল:ResourceActionAction

T run<T>(<S> Action<S, T>)
Action<S, Resource<S, T>> newResource<T>(T)

runAction :: forall a. (forall s. Action s a) -> a
newResource :: forall s a. a -> Action s (Resource s a)

এখন যখন আমরা runActionএকটি প্রদান করি তখন আমাদের Action<S, T>আশ্বাস দেওয়া হয় যে "স্কোপ" প্যারামিটার Sসম্পূর্ণরূপে বহুত্বপূর্ণ, এটি একই runActionধরণের ব্যবহার করে Sএমন কোনও ধরণের মান থেকে Resource<S, int>অব্যাহতি পেতে পারে না!

( STহাসকেলে এটি মোনাড নামে পরিচিত , যেখানে runActionডাকা হয় runST, Resourceবলা হয় STRefএবং newResourceবলা হয় newSTRef))


STএকসংখ্যা একটি খুব আকর্ষণীয় উদাহরণ। উচ্চ স্তরের বহুবর্ষটি কখন কার্যকর হবে তার আরও কয়েকটি উদাহরণ আপনি দিতে পারেন?
গ্রেগরোস

@ গ্রেগরোস: এটি অস্তিত্বের সাথেও কার্যকর। ইন Haxl , আমরা একটি অস্তিত্ববাদের মত ছিল data Fetch d = forall a. Fetch (d a) (MVar a), যা একটি তথ্য উৎস করার জন্য একটি অনুরোধ একজোড়া হয় dএবং যা ফলাফলের সংরক্ষণ করার জন্য একটি স্লট। ফলাফল এবং স্লটে অবশ্যই মিলের প্রকার থাকতে হবে, তবে সেই ধরণটি লুকানো রয়েছে, যাতে আপনার কাছে একই ডেটা উত্সের অনুরোধগুলির একটি ভিন্নধর্মী তালিকা থাকতে পারে। এখন আপনি একটি ফাংশন যা সমস্ত অনুরোধ নিয়ে আসে, একটি ফাংশন যে এক রক্ষিত রাখে দেওয়া লিখতে উচ্চ পদে পলিমরফিজম ব্যবহার করতে পারেন: fetch :: (forall a. d a -> IO a) -> [Fetch d] -> IO ()
জন পুরী

8

উচ্চতর র‌্যাঙ্কের বহুমুখীতা অত্যন্ত কার্যকর। সিস্টেম এফ (টাইপ করা এফপি ভাষার মূল ভাষা যার সাথে আপনি পরিচিত), এটি "টাইপড চার্চ এনকোডিংস" স্বীকার করার জন্য প্রয়োজনীয় যা আসলে সিস্টেম এফ প্রোগ্রামিং কিভাবে করে। এগুলি ব্যতীত সিস্টেম এফ সম্পূর্ণ অকেজো।

সিস্টেম এফ এ, আমরা সংখ্যার হিসাবে সংজ্ঞা দিই

Nat = forall c. (c -> c) -> c -> c

সংযোজন টাইপ আছে

plus : Nat -> Nat -> Nat
plus l r = Λ t. λ (s : t -> t). λ (z : t). l s (r s z)

যা উচ্চতর র‌্যাঙ্কের ধরণ ( forall c.সেই তীরগুলির মধ্যে প্রদর্শিত হবে)।

এটি অন্যান্য জায়গায়ও আসে। উদাহরণস্বরূপ, আপনি যদি ইঙ্গিত দিতে চান যে একটি গণনা একটি যথাযথ ধারাবাহিকতা পাস করার শৈলী (গুগল "কোডেন্সিটি হেস্কেল") তবে আপনি এটি ঠিক হিসাবে চাইবেন

type CPSed A = forall c. (A -> c) -> c

এমনকি সিস্টেম এফ-এ একটি জনহীন প্রকারের কথা বলার জন্য উচ্চতর র‌্যাঙ্কের বহুবচন প্রয়োজন

type Void = forall a. a 

এর দীর্ঘ এবং সংক্ষিপ্ত, খাঁটি টাইপ সিস্টেমে একটি ফাংশন লেখার জন্য (সিস্টেম এফ, কোসি) যদি আমরা কোনও আকর্ষণীয় ডেটা নিয়ে কাজ করতে চাই তবে উচ্চতর র‌্যাঙ্ক পলিমারফিজম প্রয়োজন।

বিশেষত সিস্টেম এফ এ, এই এনকোডিংগুলি "অবিশ্বাস্য" হতে হবে। এর অর্থ একটি forall a.পরিমাণকে শেষ করা প্রকারের সমস্ত ধরণের । এটি সমালোচনামূলকভাবে আমরা যে ধরণের সংজ্ঞা দিচ্ছি তা অন্তর্ভুক্ত করে। ইন forall a. aযে aআসলে জন্য দাঁড়ানো পারে forall a. aআবার! এমএল-র মতো ভাষাগুলিতে এটি ঘটনাটি নয়, এগুলি বলা হয় যে তারা "ভবিষ্যদ্বাণীমূলক" যেহেতু একটি টাইপ ভেরিয়েবল কেবলমাত্র কোয়ানটিফায়ার ছাড়াই (একরূপ বলা হয়) প্রকারের সেটগুলিতে পরিমাণ নির্ধারণ করে । আমাদের সংজ্ঞা plusপ্রয়োজনীয় impredicativity পাশাপাশি কারণ আমরা instantiated cমধ্যে l : Natহতে Nat!

অবশেষে, আমি একটি শেষ কারণ উল্লেখ করতে চাই যেখানে আপনি অযৌক্তিকভাবে পুনরাবৃত্তিযোগ্য ধরণের (সিস্টেম এফ এর বিপরীতে) এমন একটি ভাষায় এমনকি অবিশ্বাস্যতা এবং উচ্চতর র‌্যাঙ্ক বহুত্ববাদ উভয়ই পছন্দ করতে চান। হাস্কেল-এ, "স্টেট থ্রেড মোনাড" নামে পরিচিত একটি ম্যানড রয়েছে। ধারণাটি হ'ল রাজ্যের থ্রেড মোনাড আপনাকে জিনিসগুলিকে পরিবর্তিত করতে দেয় তবে এড়াতে হবে যে আপনার ফল পরিবর্তনীয় কোনও কিছুর উপর নির্ভর করবে না। এর অর্থ হল যে এসটি গণনাগুলি পর্যবেক্ষণযোগ্য খাঁটি। এই প্রয়োজনীয়তাটি প্রয়োগ করতে আমরা উচ্চতর র‌্যাঙ্ক পলিমারফিজম ব্যবহার করি

runST :: forall a. (forall s. ST s a) -> a

এখানে যে aবিষয়টি আমরা পরিচয় করিয়ে দিচ্ছি তার বাইরে এটি সীমাবদ্ধ তা নিশ্চিত করে s, আমরা জানি যে aএকটি নির্ভরযোগ্য প্রকার যা নির্ভর করে না s। আমরা sসেই নির্দিষ্ট রাষ্ট্রের থ্রেডে সমস্ত পরিবর্তনীয় জিনিসকে প্যারামাইট্রাইজ করতে ব্যবহার করি যাতে আমরা জানতে পারি যে aপরিবর্তনীয় বিষয়গুলির থেকে পৃথক এবং এইভাবে যে কোনও কিছুই সেই STগণনার সুযোগ থেকে বাঁচতে পারে ! দূর্গঠিত প্রোগ্রামগুলি বাতিল করতে প্রকারগুলি ব্যবহারের একটি দুর্দান্ত উদাহরণ।

যাইহোক, আপনি টাইপ থিওরি সম্পর্কে জানতে আগ্রহী হলে আমি ভাল বই বা দুটিতে বিনিয়োগের পরামর্শ দেব। বিটস এবং টুকরো টুকরো করে এই জিনিসগুলি শেখা খুব কঠিন। আমি পিআরসি বা হার্পারের একটি পিএল থিওরি সম্পর্কে সাধারণভাবে (এবং টাইপের তত্ত্বের কিছু উপাদান) বইয়ের পরামর্শ দেব। "প্রকার এবং প্রোগ্রামিং ভাষাগুলিতে উন্নত বিষয়গুলি" বইটিও বেশ ভাল পরিমাণের তত্ত্বকে কভার করে covers অবশেষে "মার্টিন লোফের টাইপ থিয়োরিয়ায় প্রোগ্রামিং" ইনটেনশনাল টাইপ থিওরি মার্টিন লোফের রূপরেখার একটি খুব ভাল প্রদর্শন।


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