ধরণটি কেটে নেওয়ার সময় "শিখুন আপনি একটি হাস্কেল" তে কী ধারণা তৈরি করা হয়েছে?


18

এই প্রশ্নটি বিষয়গত নয়। রেফারেন্সড বইটিতে একটি খুব নির্দিষ্ট ক্রিয়া ব্যবহার করা হয়েছে এবং আমি বুঝতে চাই যে এই শব্দবন্ধটির অর্থ কী, কারণ আমি ভীত যে আমি কিছু ভুল বুঝছি।

থেকে আপনি একটি Haskell, জানুন , নিম্নলিখিত অনুচ্ছেদ তৃতীয় ও শেষ এক ধারণকারী "আমরা অনুমান হয় *"।

data Barry t k p = Barry { yabba :: p, dabba :: t k }  

এবং এখন আমরা এটির একটি উদাহরণ তৈরি করতে চাই FunctorFunctorধরণের ধরনের চায় * -> *তবে Barryএটির মতো লাগে না। কি ধরণের Barry? ওয়েল, আমরা দেখতে এটি তিন ধরণের পরামিতি লাগে, তাই এটি হতে চলেছে something -> something -> something -> *। এটি নিরাপদ যে pএটি একটি কংক্রিট ধরণের এবং এই জাতীয় ধরণের রয়েছে *কারণ k, আমরা ধরে নিই *এবং তাই এক্সটেনশন দ্বারা, tএক ধরণের রয়েছে* -> * । এখন আসুন somethingআমরা সেই স্থানগুলির সাথে প্রতিস্থাপন করি যা আমরা স্থানধারক হিসাবে ব্যবহার করেছি এবং আমরা দেখতে পাচ্ছি এটির একটি ধরণের রয়েছে (* -> *) -> * -> * -> *

আমরা কিছুতেই কেন ধরে নিচ্ছি? "আমরা এক্স ধরে নিই (অর্থাত্ আমরা এক্সটি সত্য বলে ধরে নিই)" পড়ার পরে আমার পক্ষে এই ভাবনা স্বাভাবিক যে এক্সটি মিথ্যা, সেই ক্ষেত্রেও আমাদের বিবেচনা করা উচিত। উদাহরণস্বরূপ নির্দিষ্ট ক্ষেত্রে, করতে পারিনি tধরনের হতে (* -> *) -> *এবং kধরনের (* -> *)? যদি এটি হয় তবে যা কিছু tএবং kপ্রকৃতপক্ষে ছিল t kতা কি এখনও একটি কংক্রিটের ধরণ হবে, না?

আমি দেখতে পাচ্ছি যে যুক্তির পুরো লাইনটি তখন সংকলকের বিপরীতে পরীক্ষা করা হয়েছে, তবে আমি মনে করি না যে সংকলকটি ধরে নিয়েছে । যদি এটি হয়, আমি কী জানতে চাই, যদি তা না হয় তবে আমি আবার ভয় করি যে আমি অনুচ্ছেদের অর্থটি অনুপস্থিত।


4
আপনি সঠিক. প্রকৃতপক্ষে, আমরা যে k :: Lকোনও ধরণের জন্য থাকতে পারি L, যতক্ষণ না t :: L -> *। এখানে একটি সংকলক অবশ্যই কিছু নির্দিষ্ট চয়ন করতে হবে L, বা একটি বহুজাতির অবলম্বন। পলিজিন্ড সর্বাধিক সাধারণ বিকল্প হতে পারে তবে এখানে জিএইচসি চয়ন করে L = *(বেসিক হাস্কেলের পলকিন্ড নেই, সেগুলি এক্সটেনশন হিসাবে চালু করতে হবে)। যেহেতু এটি এমন কিছু চয়ন করে যা বরং স্বেচ্ছাচারী, LYAH "অনুমান" (AFAICT) শব্দটি ব্যবহার করে।
চি

1
ঠিক আছে, হয়তো কম্পাইলার অনুমান আমাকে অন্তত কম হতভম্ব হবে চেয়ে আমরা অনুমান , বা না এ সব।
এনরিকো মারিয়া ডি অ্যাঞ্জেলিস

উত্তর:


19

আসলে, সংকলকটি ধরে নেয়! তবে আপনি এটি পলিকিন্ডস এক্সটেনশনের সাথে না করার জন্য বলতে পারেন। আপনি এটি সম্পর্কে আরও বিস্তারিত এখানে পড়তে পারেন । সেই এক্সটেনশনটি চালু হওয়ার সাথে সাথে এর ধরণ Barryহবে forall k. (k -> *) -> k -> * -> *


-1

ভাল যুক্তি. লেখক একটি অযথা অনুমান করেন। সম্ভবত তার টাইপ ফু অধ্যায়ে বুঝতে সহজতর করার জন্য তবে নিজের মতো লোকেরা এটিকে যথাযথভাবে প্রশ্ন করতে পারে।

উভয় t, kএবং pটাইপ ভেরিয়েবল। আমরা yabba :: pএটি থেকে দেখতে পাচ্ছি যে এটি একা বাঁচতে পারে তাই এটি ধ্রুবক ফাংশনের মতো, যেন এটি কোনও প্রকারের পরিবর্তে একটি মান, এটির স্বাক্ষরটি টাইপ করে Intবা Charযাই হোক না কেন ... আপনি নাম দিন name তবে এটি যেহেতু এটি টাইপ তাই এটির সদয় স্বাক্ষর *

তবে tএখানে টাইপ kএকটি টাইপ ( dabba :: t k) টাইপ করতে একটি টাইপ ভেরিয়েবল গ্রহণ করে তাই আমরা নিশ্চিত যে (এখানে কোনও অনুমান নয়) tএর মত একটি স্বাক্ষর রয়েছে * -> *এবং kরয়েছে*

একবার আমরা এটি জানতে পারি ... টাইপের Barry t k pধরণের স্বাক্ষরটি এর (* -> *) -> * -> * -> *অর্থ এটি tপরে kএবং পরে pআমাদের Barryটাইপ দেয়।

সম্পাদনা নিশ্চিত করুন @ নিচে luqui এর মন্তব্য পড়তে।


7
k*ছাড়ের সময় যেমন দাবি করছেন তেমন সীমাবদ্ধ নয় t। উদাহরণস্বরূপ আমাদের থাকতে পারে k :: * -> *এবং t :: (* -> *) -> *doo :: k Intরেকর্ডে একটি ক্ষেত্র যুক্ত করুন এবং এটি কোনও সমস্যা ছাড়াই পাস করবে।
লুকি

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