হ্যাস্কেল টাইপ সিস্টেমটি ঠিক কীভাবে এত সম্মানিত করে (বনাম বলে, জাভা)?


204

আমি হাস্কেল শিখতে শুরু করছি । আমি এটিতে খুব নতুন, এবং আমি এটির কয়েকটি প্রাথমিক বইয়ের প্রাথমিক কাঠামোগুলির আশেপাশের জন্য কয়েকটি অনলাইন বই পড়ছি।

এর সাথে পরিচিত লোকেরা প্রায়শই যে 'মেমস' সম্পর্কে কথা বলেছিলেন তার মধ্যে একটি হ'ল পুরো "এটি যদি সংকলন করে তবে এটি কাজ করবে *" জিনিস - যা আমি মনে করি এটি টাইপ সিস্টেমের শক্তির সাথে সম্পর্কিত।

আমি বুঝতে পারছি কেন চেষ্টা করছি ঠিক Haskell, এ ব্যাপারে অন্যান্য স্ট্যাটিক্যালি টাইপ ভাষায় বেশী ভালো।

আরেকটি উপায় রাখুন, আমি জাভাতে ধরে নিয়েছি, আপনি যা করতে হবে ArrayList<String>()তা ধারণ করার জন্য আপনি কবর দেওয়ার মতো জঘন্য কিছু করতে পারেন ArrayList<Animal>()। এখানে জঘন্য জিনিসটি হ'ল আপনার stringধারণাগুলি elephant, giraffeইত্যাদি etc এবং যদি কেউ in Mercedesোকান - আপনার সংকলক আপনাকে সাহায্য করবে না।

যদি আমি করেনি কি ArrayList<Animal>()সময় কিছু পরবর্তীকালে, তারপর, আমি যদি সিদ্ধান্ত নেন আমার প্রোগ্রাম, প্রাণীদের সম্বন্ধে সত্যিই নয় এটা যানবাহন সম্পর্কে হয়, তাহলে আমি তার পরিবর্তন বলুন, একটি ফাংশন যে উত্পাদন করে ArrayList<Animal>উত্পাদন করতে ArrayList<Vehicle>এবং আমার আইডিই আমাকে সর্বত্র সেখানে বলা উচিত একটি সংকলন বিরতি।

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

আমার সন্দেহ হয় আমি কিছু গুরুত্বপূর্ণ / বেসিক মিস করছি।
আমার উপায়গুলির ত্রুটি দেখিয়ে আমি খুব খুশি হব!


31
আমি প্রকৃত উত্তর লেখার চেয়ে মানুষকে আরও জ্ঞানবান করব, তবে এর সংক্ষিপ্তসারটি হ'ল সি # এর মতো স্ট্যাটিকালি টাইপ করা ভাষায় একটি টাইপ সিস্টেম রয়েছে যা আপনাকে ডিফেসেবল কোড লিখতে সহায়তা করার চেষ্টা করে ; আপনাকে সঠিক (যেমন প্রমাণযোগ্য) কোড লিখতে সহায়তা করার জন্য হাস্কেলের চেষ্টা মতো সিস্টেম টাইপ করুন । কাজের মূল নীতিটি এমন জিনিসগুলি সরিয়ে নিয়ে যায় যা সংকলনের পর্যায়ে পরীক্ষা করা যায়; সংকলনের সময় হাস্কেল আরও জিনিস পরীক্ষা করে ।
রবার্ট হার্ভে

8
আমি হাস্কেল সম্পর্কে তেমন কিছু জানি না, তবে জাভা সম্পর্কে বলতে পারি। এটি দৃ strongly়-টাইপযুক্ত প্রদর্শিত হওয়ার পরেও এটি আপনাকে বলেছিল "জঘন্য" কাজ করার অনুমতি দেয়। জাভা তার টাইপ সিস্টেম সম্পর্কিত প্রায় প্রতিটি গ্যারান্টি জন্য, এর চারপাশে একটি উপায় আছে।

12
আমি জানি না কেন সমস্ত উত্তর Maybeকেবল শেষের দিকেই উল্লেখ করে। যদি আমাকে কেবলমাত্র একটি জিনিস বেছে নিতে হয় যে আরও জনপ্রিয় ভাষাগুলি হাস্কেলের কাছ থেকে ধার করা উচিত, এটি এটিই ছিল। এটি একটি খুব সাধারণ ধারণা (তাত্ত্বিক দিক থেকে খুব আকর্ষণীয় নয়) তবে এটি কেবল আমাদের কাজকে এত সহজ করে তুলবে।
পল

1
এখানে দুর্দান্ত উত্তর থাকবে, কিন্তু সহায়তার প্রয়াসে, স্বাক্ষরগুলি টাইপ করুন। তারা মানব ও প্রোগ্রামগুলিকে এমনভাবে প্রোগ্রামগুলির বিষয়ে যুক্তি দেখানোর অনুমতি দেয় যা জাভা কীভাবে মুশকিল মাঝারি পুনরায়: প্রকারভেদে তা চিত্রিত করে।
মাইকেল ইস্টার

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

উত্তর:


230

এখানে হাস্কেল-তে উপলব্ধ টাইপ সিস্টেম বৈশিষ্ট্যগুলির একটি আনঅর্ডার্ড তালিকা রয়েছে এবং জাভাতে উপলব্ধ নয় বা কম সুন্দর (আমার জ্ঞানের কাছে যা স্বীকৃত দুর্বল আর্ট জাভা)

  • সুরক্ষা । হাস্কেলের ধরণের বেশ ভাল "টাইপ সুরক্ষা" বৈশিষ্ট্য রয়েছে। এটি বেশ সুনির্দিষ্ট, তবে এটির মূলত অর্থ হল যে কোনও ধরণের মানগুলি অযাচিতভাবে অন্য ধরণের রূপান্তর করতে পারে না। এটি কখনও কখনও পরিবর্তনের সাথে মতবিরোধে থাকে (ওক্যামেলের মান সীমাবদ্ধতা দেখুন )
  • বীজগণিত তথ্য প্রকার । হাস্কেলের প্রকারভেদে মূলত উচ্চ বিদ্যালয়ের গণিতের মতো একই কাঠামো রয়েছে। এটি বিস্ময়করভাবে সহজ এবং সামঞ্জস্যপূর্ণ, তবুও, এটি হিসাবে দেখা যাচ্ছে, আপনি সম্ভবত যতটা ইচ্ছা শক্তিশালী। এটি কেবল কোনও টাইপ সিস্টেমের জন্য একটি দুর্দান্ত ভিত্তি।
    • ডেটাটাইপ-জেনেরিক প্রোগ্রামিং । এটি জেনেরিক ধরণের মতো নয় ( সাধারণীকরণ দেখুন )। পরিবর্তে, টাইপ কাঠামোর সরলতার কারণে যেমন কোডটি লেখার তুলনামূলকভাবে সহজ যা কাঠামোর উপর সাধারণভাবে পরিচালিত হয় তার আগে উল্লেখযোগ্য। পরে আমি এই বিষয়ে কথা বলি যে কীভাবে Eqইউটিলিটির মতো কিছু হ্যাশেল কম্পাইলার দ্বারা কোনও ব্যবহারকারী-সংজ্ঞায়িত প্রকারের জন্য স্বয়ংক্রিয়ভাবে প্রাপ্ত। মূলত এটি যেভাবে এটি করে তা হ'ল সাধারণ, সাধারণ কাঠামোর উপর ভিত্তি করে কোনও ব্যবহারকারীর সংজ্ঞায়িত ধরণের অন্তর্নিহিত এবং মানগুলির মধ্যে এটি মেলে struct কাঠামোগত সাম্যের খুব প্রাকৃতিক রূপ।
  • পারস্পরিক পুনরাবৃত্তি টাইপ । এটি অ-তুচ্ছ ধরনের লেখার জন্য কেবল একটি প্রয়োজনীয় উপাদান।
    • নেস্টেড প্রকারের । এটি আপনাকে ভেরিয়েবলগুলির তুলনায় পুনরাবৃত্ত প্রকারগুলি সংজ্ঞায়িত করতে দেয় যা বিভিন্ন ধরণের পুনরাবৃত্তি করে। উদাহরণ হিসেবে বলা যায়, সুষম গাছের এক ধরনের data Bt a = Here a | There (Bt (a, a))। এর বৈধ মান সম্পর্কে সাবধানতার সাথে চিন্তা করুন Bt aএবং লক্ষ্য করুন যে কীভাবে এই ধরণের কাজ করে। এটা কৌশলী!
  • জেনারালাইজেশন । কোনও টাইপ সিস্টেমে না থাকাই এটি প্রায় নির্বোধ (আহেম, আপনার দিকে তাকাচ্ছেন, যান)। প্রকারের ভেরিয়েবলের ধারণাগুলি এবং কোডটির বিষয়ে কথা বলার ক্ষমতা থাকা গুরুত্বপূর্ণ যা সেই ভেরিয়েবলের পছন্দ থেকে পৃথক। হ্যান্ডলি মিলনার একটি টাইপ সিস্টেম যা সিস্টেম এফ থেকে প্রাপ্ত Has হাস্কেলের টাইপ সিস্টেমটি এইচএম টাইপিংয়ের একটি ব্যাখ্যা এবং সিস্টেম এফ মূলত জেনারালাইজেশনের চক্কর। আমি যেটি বলতে চাইছি তা হ্যাসেলের খুব ভাল জেনারালাইজেশন গল্প রয়েছে।
  • বিমূর্ত প্রকারের । এখানে হাস্কেলের গল্প দুর্দান্ত নয় তবে অস্তিত্বহীনও নয়। পাবলিক ইন্টারফেস থাকলে তবে একটি ব্যক্তিগত বাস্তবায়ন রয়েছে এমন প্রকারের রচনাগুলি লেখা সম্ভব possible এটি আমাদের উভয়কে পরবর্তী সময়ে বাস্তবায়ন কোডে পরিবর্তনগুলি স্বীকার করতে অনুমতি দেয় এবং গুরুত্বপূর্ণভাবে যেহেতু এটি হাস্কেলের সমস্ত ক্রিয়াকলাপের ভিত্তি, তাই "ম্যাজিক" প্রকারগুলি লিখুন যার মতো সুস্পষ্ট সংজ্ঞাযুক্ত ইন্টারফেস রয়েছে IO। সত্যিই জাভা সম্ভবত একটি ভাল অ্যাবস্ট্রাক্ট টাইপ গল্প আছে, সত্যি বলতে, তবে আমি মনে করি না যতক্ষণ না ইন্টারফেসগুলি আরও বেশি জনপ্রিয় হয়ে ওঠে তা সত্যই সত্য ছিল।
  • প্যারামিট্রিকটি । হাসেল মানগুলির কোনও সার্বজনীন ক্রিয়াকলাপ নেই। জাভা রেফারেন্স সাম্যতা এবং হ্যাশিং এর মতো জিনিসগুলির সাথে এটি আরও লঙ্ঘন করে এবং আরও জোর করে জোর করে। এর অর্থ হ'ল আপনি এমন প্রকারের সম্পর্কে নিখরচায় উপপাদাগুলি পান যা আপনাকে কোনও ধরণের অপারেশন বা অর্থটি সম্পূর্ণরূপে উল্লেখযোগ্য ডিগ্রি থেকে সম্পূর্ণরূপে জানতে দেয় --- নির্দিষ্ট প্রকারগুলি এমন যে কেবল খুব কম সংখ্যক বাসিন্দা থাকতে পারে।
  • ট্রাইসিয়ার জিনিসগুলি এনকোড করার সময় উচ্চ-ধরণের ধরণের সমস্ত ধরণ প্রদর্শিত হয়। ফ্যান্টেক্টর / প্রয়োগকারী / মোনাড, ভাঁজযোগ্য / ট্র্যাভারেবল, পুরো mtlইফেক্ট টাইপিং সিস্টেম, সাধারণীকরণকারী ফান্টারের ফিক্সপয়েন্টগুলি। তালিকা এবং উপর যায়। অনেকগুলি জিনিস রয়েছে যা উচ্চতর ধরণের এবং অপেক্ষাকৃত কয়েকটি টাইপ সিস্টেমে সর্বোত্তমভাবে প্রকাশ করা হয় এমনকি ব্যবহারকারীকে এই বিষয়গুলি সম্পর্কে কথা বলতে দেয়।
  • ক্লাস টাইপ করুন । আপনি যদি টাইপ সিস্টেমকে লজিক হিসাবে ভাবেন। যা দরকারী is তবে আপনার কাছে প্রায়শই জিনিসগুলি প্রমাণ করার দাবি করা হয়। বেশিরভাগ ক্ষেত্রে এটি মূলত শব্দের আওয়াজ হয়: কেবলমাত্র একটি সঠিক উত্তর হতে পারে এবং প্রোগ্রামারকে এটি জানাতে সময় এবং প্রচেষ্টার অপচয় হয়। টাইপচ্লাস হ্যাসেল আপনার পক্ষে প্রুফ তৈরি করার জন্য একটি উপায়। আরও কংক্রিটের শর্তে এটি আপনাকে সহজ "টাইপ সমীকরণ সিস্টেমগুলি" সমাধান করতে দেয় যেমন "আমরা কোন ধরণের (+)জিনিসগুলি একসাথে করতে চাই? ওহ Integer, ঠিক আছে! আসুন এখনই সঠিক কোডটি ইনলাইন করুন!"! আরও জটিল সিস্টেমে আপনি আরও আকর্ষণীয় সীমাবদ্ধতা স্থাপন করতে পারেন।
    • বাধা ক্যালকুলাস । হাস্কেলের সীমাবদ্ধতাগুলি - যা টাইপক্লাস প্রলোগ সিস্টেমে পৌঁছানোর প্রক্রিয়া struct কাঠামোগতভাবে টাইপ করা হয়। এটি সাব টাইপিং সম্পর্কের একটি খুব সহজ রূপ দেয় যা আপনাকে সহজতর থেকে জটিল বাধাগুলি একত্রিত করতে দেয়। পুরো mtlগ্রন্থাগারটি এই ধারণার উপর ভিত্তি করে।
    • ডেরাইভিং । অর্ডার চালাতে সালে canonicity typeclass সিস্টেমের এটা সীমাবদ্ধতার ব্যবহারকারী-সংজ্ঞায়িত ধরনের instantiate আবশ্যক বর্ণনা করতে প্রায়ই তুচ্ছ কোড অনেক লিখতে প্রয়োজন। হাস্কেল প্রকারের খুব সাধারণ কাঠামোতে করুন, প্রায়শই আপনার জন্য এই বয়লারপ্লেটটি সংকলককে জিজ্ঞাসা করা সম্ভব।
    • শ্রেণীর প্রোলোগুলি টাইপ করুন । হাস্কেল টাইপ শ্রেণীর সমাধানকারী - যে সিস্টেমটি আমি আগে উল্লেখ করেছি সেগুলি "প্রমাণগুলি" উত্পন্ন করছে - মূলত উত্তম শব্দার্থিক বৈশিষ্ট্যযুক্ত প্রোলোগের একটি পঙ্গু রূপ। এর অর্থ আপনি প্রলোগ টাইপের প্রকৃত লোমশ জিনিসগুলিকে এনকোড করতে পারেন এবং সংকলনের সময়ে এগুলি হ্যান্ডেল করার আশা করতে পারেন। একটি উত্তম উদাহরণ হতে পারে এমন প্রমাণের জন্য সমাধান করা যে আপনি দুটি অর্জাতীয় তালিকার সমকক্ষ হ'ল যদি আপনি অর্ডারটি ভুলে যান — তারা সমকামী ভিন্ন ভিন্ন "সেট"।
    • মাল্টি-প্যারামিটার ধরণের শ্রেণি এবং কার্যকরী নির্ভরতা । এগুলি টাইপক্লাস প্রলোগের জন্য কেবলমাত্র ব্যপক কার্যকর পরিশোধনসমূহ। আপনি যদি প্রোলোগকে জানেন তবে আপনি একাধিক ভেরিয়েবলের পূর্বাভাস লিখতে পারলে আপনি ভাববাদী শক্তি কতটা বাড়বে তা আপনি কল্পনা করতে পারেন।
  • খুব ভাল অনুমিতি । হিন্ডি মিলার টাইপ সিস্টেমের উপর ভিত্তি করে ভাষার বেশ ভাল ধারণা রয়েছে। এইচএম নিজেই সম্পূর্ণ অনুমিতি থাকে যার অর্থ আপনার কখনই কোনও টাইপ ভেরিয়েবল লেখার দরকার নেই। হাস্কেল 98, হাস্কেলের সহজতম রূপ, ইতিমধ্যে এটি খুব বিরল পরিস্থিতিতে ফেলে দিয়েছে। সাধারণত, এইচএম-তে আরও শক্তি যুক্ত করার সময় এবং ব্যবহারকারীরা কখন অভিযোগ করেন তা দেখার জন্য আধুনিক হাস্কেল ধীরে ধীরে সম্পূর্ণ অনুমানের স্থান হ্রাস করার জন্য একটি পরীক্ষা হয়ে দাঁড়িয়েছে। লোকেরা খুব কমই অভিযোগ করে — হাস্কেলের অনুভূতিটি বেশ ভাল।
  • খুব, খুব, খুব দুর্বল সাব টাইপিং । আমি আগে উল্লেখ করেছি যে টাইপক্লাস প্রোলোগ থেকে সীমাবদ্ধ ব্যবস্থার কাঠামোগত সাব টাইপিংয়ের ধারণা রয়েছে। এটি হ্যাসকেলে সাব টাইপিংয়ের একমাত্র ফর্ম । সাবটাইপিং যুক্তি এবং অনুমানের জন্য ভয়ানক। এটি সেই সমস্যাগুলির প্রত্যেকটিকে উল্লেখযোগ্যভাবে শক্ত করে তোলে (সমতার ব্যবস্থার পরিবর্তে বৈষম্যের একটি ব্যবস্থা)। ভুল বোঝাবুঝি করাও খুব সহজ (সাবক্লাসিংটি কি সাবটিপিংয়ের মতো একই? অবশ্যই না! তবে লোকেরা খুব ঘন ঘন সেই বিভ্রান্তিতে সেই ভাষা এবং বহু ভাষা সহায়তা করে! আমরা এখানে কীভাবে শেষ হয়ে গেলাম? আমি মনে করি যে কেউ কখনও এলএসপি পরীক্ষা করে না।)
    • উল্লেখ্য সম্প্রতি (গোড়ার দিকে 2017) স্টিভেন দোলন তার প্রকাশিত থিসিস উপর MLsub , যা একটি হয়েছে এমএল এবং Hindley-মিলনার টাইপ অনুমান একটি বৈকল্পিক খুব সুন্দর subtyping গল্প ( তাও দেখতে )। আমি উপরে যা লিখেছি তা এতে আপত্তিজনক নয় - বেশিরভাগ সাব-টাইপিং সিস্টেমগুলি ভেঙে গেছে এবং খারাপ ধারণা রয়েছে suggest তবে আমরা কেবল আজই পুরোপুরি অনুমান এবং একসাথে সুন্দরভাবে খেলার কিছু আশাব্যঞ্জক উপায় খুঁজে পেয়েছি suggest এখন পুরোপুরি পরিষ্কার হয়ে উঠতে, জাভা-র সাব টাইপিংয়ের ধারণাগুলি কোনওভাবেই ডোলানের অ্যালগরিদম এবং সিস্টেমগুলির সুবিধা নিতে সক্ষম নয়। এটি সাব টাইপিংয়ের অর্থ কী তা নিয়ে পুনর্বিবেচনা প্রয়োজন।
  • উচ্চ পদমর্যাদার ধরণ । আমি আগে জেনারালাইজেশন সম্পর্কে কথা বলেছি, তবে কেবল সাধারণীকরণের চেয়ে আরও বেশি কিছু দরকারী যেগুলি তাদের মধ্যে সাধারণ ভেরিয়েবল রয়েছে সেগুলি সম্পর্কে কথা বলতে সক্ষম হয় । উদাহরণস্বরূপ, উচ্চতর অর্ডার স্ট্রাকচারের মধ্যে একটি ম্যাপিং যা অজ্ঞান ( প্যারাম্যাট্রিকিটি দেখুন ) সেই স্ট্রাকচারগুলিতে "ধারণাগুলি" কী রকম রয়েছে তা বোঝায় (forall a. f a -> g a)। সোজা এইচএম আপনি এই ধরনের একটি ফাংশন লিখতে পারেন, কিন্তু উচ্চ পদে ধরনের সহ আপনাকে একটি যেমন একটি ফাংশন দাবিতে যুক্তি যেমন: mapFree :: (forall a . f a -> g a) -> Free f -> Free g। লক্ষ্য করুন যে aভেরিয়েবলটি কেবল যুক্তির মধ্যে আবদ্ধ। এই তার মানে definer ফাংশনের mapFreeসিদ্ধান্ত নিতে কি পায় aযখন তারা এটি না ব্যবহারকারীর ব্যবহার এ instantiated হয় mapFree
  • অস্তিত্বের ধরণের । উচ্চ-স্তরের প্রকারগুলি আমাদের সর্বজনীন পরিমাপের বিষয়ে কথা বলার অনুমতি দেয়, অস্তিত্বমূলক প্রকারগুলি আমাদের অস্তিত্বের পরিমাপের বিষয়ে কথা বলতে দেয়: ধারণাটি যে কেবলমাত্র কিছু সমীকরণ সন্তুষ্ট করে কিছু অজানা ধরণের উপস্থিত রয়েছে idea এটি দরকারী হয়ে ওঠে এবং এটির জন্য আরও বেশি দিন যেতে বেশিক্ষণ সময় লাগবে।
  • পরিবার টাইপ করুন । কখনও কখনও টাইপক্লাস প্রক্রিয়াগুলি অসুবিধে হয় যেহেতু আমরা সবসময় প্রোলোগে ভাবি না। প্রকারের পরিবারগুলি আমাদের প্রকারের মধ্যে সরাসরি ক্রিয়ামূলক সম্পর্ক লিখতে দেয় ।
    • বন্ধ পরিবার পরিবার । ধরণের পরিবারগুলি ডিফল্টরূপে উন্মুক্ত থাকে যা বিরক্তিকর কারণ এর অর্থ হ'ল আপনি যে কোনও সময় তাদের প্রসারিত করতে পারলে আপনি তাদের সাফল্যের কোনও আশা দিয়ে "বিপরীত" করতে পারবেন না। এটি কারণ আপনি ইনজেকটিশনেটি প্রমাণ করতে পারবেন না , তবে বদ্ধ ধরণের পরিবারগুলির সাথে আপনি পারেন।
  • প্রকারের সূচকযুক্ত প্রকার এবং প্রকার প্রচার । আমি এই মুহুর্তে সত্যিই বিদেশী হয়ে উঠছি, তবে এগুলি সময়ে সময়ে ব্যবহারিক ব্যবহার করে have আপনি যদি এমন এক ধরণের হ্যান্ডলগুলি লিখতে চান যা খালি বা বন্ধ থাকে তবে আপনি খুব সুন্দরভাবে এটি করতে পারেন। নিম্নলিখিত স্নিপেটে লক্ষ্য করুন যে Stateএকটি খুব সাধারণ বীজগণিত টাইপ যা এর মানগুলি প্রকার-স্তরেও প্রচারিত হয়েছিল। তারপর, পরবর্তীকালে, আমরা কথা বলতে পারি টাইপ কনস্ট্রাকটর মত Handleনির্দিষ্ট সময়ে আর্গুমেন্ট গ্রহণ যেমন ধরণের মত State। এটি সমস্ত বিবরণ বুঝতে বিভ্রান্তিকর, তবে এটি খুব ঠিক right

    data State = Open | Closed
    
    data Handle :: State -> * -> * where
      OpenHandle :: {- something -} -> Handle Open a
      ClosedHandle :: {- something -} -> Handle Closed a
    
  • রানটাইম টাইপের উপস্থাপনা যা কাজ করে । জাভা কিছু ধরণের মুছে ফেলার জন্য এবং সেই বৈশিষ্ট্যটির বৃষ্টিপাতের জন্য কিছু লোকের কুচকাওয়াজ কুখ্যাত। প্রকার মুছে ফেলা হ'ল সঠিক উপায়, তবে আপনার যদি কোনও ফাংশন থাকে getRepr :: a -> TypeReprতবে আপনি খুব কমপক্ষে প্যারামিট্রিকটি লঙ্ঘন করেন। সবচেয়ে খারাপটি হ'ল যদি এটি কোনও ব্যবহারকারী-উত্পাদিত ফাংশন যা রানটাইমের সময় অনিরাপদ জবরদস্তিগুলি ট্রিগার করতে ব্যবহৃত হয় ... তবে আপনার কাছে একটি বিশাল সুরক্ষা উদ্বেগ রয়েছে । হাস্কেলের Typeableসিস্টেমটি নিরাপদ তৈরির অনুমতি দেয় coerce :: (Typeable a, Typeable b) => a -> Maybe b। এই সিস্টেমটি সংকলকটিতে Typeableপ্রয়োগ করা (এবং ইউজারল্যান্ড নয়) উপর নির্ভর করে এবং হাস্কেলের টাইপক্লাস প্রক্রিয়া এবং এটি অনুসরণ করার নিশ্চয়তা প্রাপ্ত আইনগুলি ছাড়াও এ জাতীয় সুন্দর শব্দার্থবিদ্যা দেওয়া যায় না।

এইগুলির চেয়ে বেশি তবে হাস্কেলের টাইপ সিস্টেমের মানও প্রকারগুলি কীভাবে ভাষাটি বর্ণনা করে তার সাথে সম্পর্কিত। এখানে হ্যাস্কেলের কয়েকটি বৈশিষ্ট্য রয়েছে যা টাইপ সিস্টেমের মাধ্যমে মূল্য দেয়।

  • বিশুদ্ধতা । "পার্শ্ব প্রতিক্রিয়া" এর খুব, খুব, খুব বিস্তৃত সংজ্ঞার জন্য হাস্কেল কোনও পার্শ্ব প্রতিক্রিয়াকে অনুমতি দেয় না। প্রকারগুলি ইনপুট এবং আউটপুট পরিচালনা করে এবং কোনও পার্শ্ব প্রতিক্রিয়া ছাড়াই সবকিছুকে ইনপুট এবং আউটপুটগুলিতে দায়ী করা উচিত কারণ এটি আপনাকে আরও প্রকারের মধ্যে আরও তথ্য রাখতে বাধ্য করে ।
    • আই । পরবর্তীকালে Haskell, পার্শ্ব সম্পর্কে কথা বলতে একটি উপায় প্রয়োজন প্রভাব-যেহেতু কোনো বাস্তব প্রোগ্রাম, কিছু-তাই একটি typeclasses সমন্বয়, উচ্চ kinded ধরনের অন্তর্ভুক্ত করা আবশ্যক এবং বিমূর্ত ধরনের একটি নির্দিষ্ট, সুপার-বিশেষ ধরনের নামের বস্তু ব্যবহার ধারণা বৃদ্ধি দিয়েছেন IO aপ্রতিনিধিত্ব করতে পার্শ্ব-প্রভাবক গণনা যার ফলস্বরূপ মানগুলি হয় a। এটি একটি খাঁটি ভাষার অভ্যন্তরে এম্বেড করা খুব সুন্দর এফেক্ট সিস্টেমের ভিত্তি ।
  • অভাবnull । সকলেই জানেন যে nullআধুনিক প্রোগ্রামিং ভাষার কোটি কোটি ডলার ভুল mistake বীজগণিতের ধরণগুলি, বিশেষত আপনার যে ধরণের প্রকারকে টাইপের Aমধ্যে রূপান্তরিত Maybe Aকরে তাতে সমস্যা সম্পূর্ণরূপে প্রশমিত করে কেবলমাত্র "অস্তিত্ব নেই" রাষ্ট্র সংযোজন করার ক্ষমতা null
  • পলিমারফিক পুনরাবৃত্তি । এটি আপনাকে পুনরাবৃত্ত ফাংশনগুলি সংজ্ঞায়িত করতে দেয় যা টাইপ ভেরিয়েবলগুলি তাদের নিজস্বীকরণের ক্ষেত্রে প্রতিটি পুনরাবৃত্তির কলগুলিতে বিভিন্ন ধরণের ব্যবহার করার পরেও সাধারণকরণ করে। এটি সম্পর্কে কথা বলা কঠিন তবে নেস্টেড ধরণের সম্পর্কে কথা বলার জন্য বিশেষভাবে কার্যকর। ফিরে দেখ Bt aআগে থেকে ধরন ও তার আকার গনা একটি ফাংশন লিখতে চেষ্টা করে দেখুন: size :: Bt a -> Int। এটি দেখতে কিছুটা ভালো লাগবে size (Here a) = 1এবং size (There bt) = 2 * size bt। অপারেশনালভাবে এটি খুব জটিল নয়, তবে লক্ষ্য করুন যে sizeশেষ সমীকরণটিতে পুনরাবৃত্তি কলটি ভিন্ন ধরণের ঘটে , তবুও সামগ্রিক সংজ্ঞাটিতে একটি দুর্দান্ত সাধারণীকরণ রয়েছে size :: Bt a -> Int। নোট করুন যে এটি এমন একটি বৈশিষ্ট্য যা মোট অনুমানটি ভেঙে দেয় তবে আপনি যদি কোনও ধরণের স্বাক্ষর সরবরাহ করেন তবে হাস্কেল এটিকে অনুমতি দেবে।

আমি চালিয়ে যেতে পারলাম, তবে এই তালিকাটি আপনাকে প্রথমে এবং পরে কিছু করা উচিত।


7
নুল একটি বিলিয়ন ডলার "ভুল" ছিল না। এমন কেস রয়েছে যেখানে কোনও অর্থবোধক সম্ভাব্য উপস্থিতির আগে পয়েন্টারটিকে ডিটারফার করা হবে না তা স্থিরভাবে যাচাই করা সম্ভব নয় ; এই জাতীয় ক্ষেত্রে একটি চেষ্টা করার জন্য ডেরিফারেন্স ট্র্যাপ থাকা প্রায়শই পয়েন্টারটি প্রথমে অর্থহীন কোনও জিনিস সনাক্ত করার প্রয়োজনের চেয়ে ভাল। আমি মনে করি সবচেয়ে বড় নাল-সম্পর্কিত ভুলটির বাস্তবায়ন ছিল যা দেওয়া হয়েছিল , তবে তা ফাঁদে পড়বে, কিন্তু ফাঁদে যাবে নাchar *p = NULL;*p=1234char *q = p+5678;*q = 1234;
সুপারক্যাট

37
এটি কেবল টনি হোয়ের থেকে সরাসরি উদ্ধৃত হয়েছে: en.wikedia.org/wiki/Tony_Hoare#Apologies_and_retferences । যদিও আমি নিশ্চিত যে nullপয়েন্টার গাণিতিকের সময়গুলি যখন প্রয়োজন হয় তখনও আমি তার পরিবর্তে এটি ব্যাখ্যা করে বলি যে পয়েন্টার পাটিগণিতটি আপনার ভাষার শব্দার্থককে হোস্ট করার জন্য একটি খারাপ জায়গা, এটি নাল এখনও ভুল নয়।
জে আব্রাহামসন

18
@ সুপের্যাট, আপনি সত্যিই শূন্যতা ছাড়াই একটি ভাষা লিখতে পারেন। এটি অনুমোদিত বা না একটি পছন্দ।
পল ড্রাগার

6
@ সুপের্যাট - এই সমস্যাটি হাসকলেও রয়েছে, তবে অন্যরকম আকারে রয়েছে। হাস্কেল সাধারণত অলস এবং অপরিবর্তনীয় এবং তাই মূল্যায়িত না p = undefinedহওয়ায় আপনাকে এতক্ষণ লেখার অনুমতি দেয় p। আরও কার্যকরভাবে, আপনি এতক্ষণে undefinedকিছুটা পরিবর্তনযোগ্য রেফারেন্স রাখতে পারেন, যতক্ষণ আপনি এটি মূল্যায়ন করেন না। আরও গুরুতর চ্যালেঞ্জ হ'ল অলস কম্পিউটেশনগুলি যা শেষ হতে পারে না, অবশ্যই কোনটি অনির্বচনীয়। মূল পার্থক্যটি হ'ল এগুলি সমস্ত নির্বিঘ্নে প্রোগ্রামিং ত্রুটিগুলি এবং সাধারণ যুক্তি প্রকাশের জন্য কখনও ব্যবহৃত হয় না।
খ্রিস্টান কনকল

6
@ সুপ্যাক্যাট হাসেল পুরোপুরি রেফারেন্স শব্দার্থের অভাব রয়েছে (এটি রেফারেনশিয়াল স্বচ্ছতার ধারণা যা তাদের রেফারেন্টগুলির সাথে রেফারেন্সগুলি প্রতিস্থাপনের মাধ্যমে সবকিছু সংরক্ষণ করা হয়)। সুতরাং, আমি মনে করি আপনার প্রশ্নটি উদ্ভট।
জে আব্রাহামসন

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

7
উত্তম উত্তর - আপনি কি আমাকে উচ্চতর ধরণের ধরণের একটি সাধারণ উদাহরণ দিতে পারেন, মনে করুন এটি জাভাতে কেন করা অসম্ভব তা বুঝতে আমাকে সহায়তা করবে।
ফ্যাটম্যান্স

3
এখানে কিছু ভাল উদাহরণ আছে
কার্ল বিলেফেল্ট

3
প্যাটার্ন ম্যাচিংও সত্যই গুরুত্বপূর্ণ, এর অর্থ আপনি সহজেই সিদ্ধান্তগুলি সুপারিশ করতে কোনও বস্তুর ধরণটি ব্যবহার করতে পারেন।
বেনিয়ামিন গ্রুইনবাউম

2
@ বেনজামিন গ্রুয়েনবাউম আমার মনে হয় না যে আমি এটিকে একটি টাইপ সিস্টেম বৈশিষ্ট্য বলব।
ডোভাল

3
যদিও এডিটি এবং এইচকেটিগুলি উত্তরটির সুনির্দিষ্ট অংশ, আমি সন্দেহ করি যে কেউ এই প্রশ্নটি জিজ্ঞাসা করছেন কেন তারা দরকারী তা জানতে চাইছেন, আমি পরামর্শ দিচ্ছি যে এটি ব্যাখ্যা করার জন্য উভয় বিভাগকে প্রসারিত করা দরকার
জে কে।

62
a :: Integer
b :: Maybe Integer
c :: IO Integer
d :: Either String Integer

হাস্কেলের মধ্যে: একটি পূর্ণসংখ্যা, একটি পূর্ণসংখ্যা যা শূন্য হতে পারে, একটি পূর্ণসংখ্যা যার মান বাইরের বিশ্ব থেকে আসে এবং একটি পূর্ণসংখ্যা যা পরিবর্তে স্ট্রিং হতে পারে, সমস্ত স্বতন্ত্র ধরণের - এবং সংকলক এটি প্রয়োগ করে । আপনি একটি হাস্কেল প্রোগ্রাম সংকলন করতে পারবেন না যা এই পার্থক্যগুলিকে সম্মান করতে ব্যর্থ।

(তবে, আপনি প্রকারের ঘোষণাগুলি বাদ দিতে পারেন most বেশিরভাগ ক্ষেত্রেই, সংকলকটি আপনার ভেরিয়েবলের জন্য সর্বাধিক সাধারণ প্রকারটি নির্ধারণ করতে পারে যার ফলস্বরূপ একটি সফল সংকলন ঘটবে that তা কি ঝরঝরে নয়?)


11
+1 যদিও এই উত্তরটি সম্পূর্ণ নয় তবে আমি মনে করি এটি আরও ভাল স্তরের

1
+1 যদিও এটি ব্যাখ্যা করতে সহায়তা করবে যে অন্যান্য ভাষাগুলিরও রয়েছে Maybe(যেমন জাভা Optionalএবং স্কালার Option), তবে সেই ভাষাগুলিতে এটি একটি অর্ধ-বেকড সমাধান, যেহেতু আপনি সর্বদা nullসেই ধরণের একটি ভেরিয়েবলকে অর্পণ করতে পারেন এবং আপনার প্রোগ্রামটি রান-পর্বে বিস্ফোরিত হতে পারে- সময়। হাস্কেল [1] এর সাথে এটি ঘটতে পারে না, কারণ কোনও নাল মান নেই , তাই আপনি কেবল প্রতারণা করতে পারবেন না। ([1]: আসলে, আপনি আংশিক ফাংশনগুলি ব্যবহার করে যেমন নালপয়েন্টার এক্সসেপশন এর অনুরূপ ত্রুটি তৈরি করতে পারেন যেমন আপনার fromJustযখন থাকে Nothingতবে সেই ফাংশনগুলি সম্ভবত ভ্রূণু হয়)।
Andres F.

2
"একটি পূর্ণসংখ্যা যার মান বাইরের বিশ্ব থেকে এসেছিল" - IO Integer'সাবপ্রগ্রামের সাথে কী হবে না , যা মৃত্যুদন্ড কার্যকর হলে পূর্ণসংখ্যা দেয়'? ক) মতই main = c >> cপ্রথম দ্বারা ফিরে মান cদ্বিতীয় দ্বারা তারপর আলাদা হতে পারে cযখন aতার অবস্থান নির্বিশেষে মান একই হবে (যতদিন আমরা একক সুযোগ হয়) খ) ধরনের যা তার sanatisation জোরদার করা বহির্বিশ্বের থেকে মানগুলি উল্লেখ করে আছে (অর্থাত্ এগুলি সরাসরি না রেখে প্রথমে ব্যবহারকারীর কাছ থেকে ইনপুটটি সঠিক / দূষিত নয় কিনা তা পরীক্ষা করে দেখুন)।
ম্যাকিয়েজ পাইচোতকা

4
ম্যাকিয়েজ, এটি আরও সঠিক হবে। আমি সরলতার জন্য চেষ্টা করে যাচ্ছিলাম।
ওল্ফফ্যান

30

হাস্কেল সম্পর্কে প্রচুর লোক ভাল জিনিস তালিকাভুক্ত করেছে। তবে আপনার নির্দিষ্ট প্রশ্নের "কেন টাইপ সিস্টেম প্রোগ্রামগুলি আরও সঠিক করে তোলে?" এর উত্তরে আমি সন্দেহ করি যে উত্তরটি "প্যারামেট্রিক পলিমারফিজম"।

নিম্নলিখিত হাস্কেল ফাংশনটি বিবেচনা করুন:

foobar :: x -> y -> y

নেই আক্ষরিক শুধুমাত্র এক সম্ভাব্য উপায়ে এই ফাংশন বাস্তবায়ন। শুধু টাইপ স্বাক্ষর কসম, আমি বলতে পারেন অবিকল এই ফাংশন কি, কারণ শুধুমাত্র একটি সম্ভাব্য বিষয় এটা আছে করতে না। [ঠিক আছে, বেশ নয়, প্রায়!]

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

এই ফাংশনটি বিবেচনা করুন:

fubar :: Int -> (x -> y) -> y

এই ফাংশন অসম্ভব । আপনি আক্ষরিকভাবে এই ফাংশনটি প্রয়োগ করতে পারবেন না। আমি ঠিক টাইপ স্বাক্ষর থেকে বলতে পারি।

যেমন আপনি দেখতে পাচ্ছেন, একটি হাস্কেল টাইপের স্বাক্ষর আপনাকে অনেক কিছু জানায়!


সি # এর সাথে তুলনা করুন। (দুঃখিত, আমার জাভা কিছুটা মরিচা।

public static TY foobar<TX, TY>(TX in1, TY in2)

এই পদ্ধতিটি করতে পারে এমন দুটি জিনিস রয়েছে:

  • in2ফলাফল হিসাবে ফিরে ।
  • চিরকালের জন্য লুপ করুন, এবং কখনই কিছুই ফিরিয়ে দেবেন না।
  • একটি ব্যতিক্রম নিক্ষেপ করুন, এবং কখনই কোনও কিছু ফেরান না।

আসলে, হাস্কেলের এই তিনটি বিকল্পও রয়েছে। তবে সি # আপনাকে অতিরিক্ত বিকল্পগুলি দেয়:

  • নাল ফিরে। (হাস্কেলের নাল নেই)
  • in2এটি ফেরত দেওয়ার আগে পরিবর্তন করুন । (হাস্কেলের জায়গায় জায়গায় পরিবর্তন নেই))
  • প্রতিবিম্ব ব্যবহার করুন। (হাস্কেলের প্রতিচ্ছবি নেই))
  • ফলাফল ফেরার আগে একাধিক আই / ও ক্রিয়া সম্পাদন করুন। (হাস্কেল আপনাকে I / O সঞ্চালন করতে দেবে না আপনি যদি না ঘোষণা করেন যে আপনি এখানে I / O করছেন))

প্রতিবিম্ব একটি বিশেষত বড় হাতুড়ি; প্রতিবিম্ব ব্যবহার করে, আমি TYপাতলা বাতাসের বাইরে একটি নতুন অবজেক্ট তৈরি করতে পারি এবং এটি ফিরিয়ে দিতে পারি! আমি উভয় অবজেক্টটি পরিদর্শন করতে পারি এবং আমি যা পাই তার উপর নির্ভর করে বিভিন্ন ক্রিয়া করতে পারি। আমি যে দুটি বস্তু পাস করেছি তাতে যথেচ্ছ পরিবর্তন করতে পারি।

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


foobarবিপরীতে হাস্কেল ফাংশনটি কেবলমাত্র কিছু ডেটা নিতে পারে এবং সেই ডেটাটি অপরিবর্তিত অবস্থায় ফিরিয়ে দিতে পারে। এটি ডেটা "তাকান" করতে পারে না, কারণ সংকলন সময়ে এর ধরণ অজানা। এটি নতুন ডেটা তৈরি করতে পারে না, কারণ ... ভাল, আপনি কোনও সম্ভাব্য ধরণের ডেটা কীভাবে তৈরি করবেন? এর জন্য আপনার প্রতিচ্ছবি প্রয়োজন। এটি কোনও আই / ও সম্পাদন করতে পারে না, কারণ প্রকার স্বাক্ষরটি ঘোষণা করে না যে I / O সম্পাদিত হচ্ছে। সুতরাং এটি ফাইল সিস্টেম বা নেটওয়ার্ক, বা এমনকি একই প্রোগ্রামে থ্রেড চলমান সাথে ইন্টারঅ্যাক্ট করতে পারে না! (অর্থাৎ এটি 100% গ্যারান্টিযুক্ত থ্রেড-নিরাপদ))

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

(স্পষ্ট করে বলার জন্য: হাস্কেল ফাংশনগুলি লেখার জন্য এটি এখনও সম্ভব যেখানে টাইপ স্বাক্ষর আপনাকে বেশি কিছু জানায় Int -> Intনা just যা কিছু সম্পর্কে হতে পারে even তবে তারপরেও আমরা জানি যে একই ইনপুট সর্বদা 100% নিশ্চিততার সাথে একই আউটপুট উত্পাদন করে। জাভা এমনকি গ্যারান্টি দেয় না!)


4
+1 দুর্দান্ত উত্তর! এটি খুব শক্তিশালী এবং প্রায়শই হাস্কেলের কাছে আগতদের দ্বারা অপ্রস্তুত হয়। যাইহোক, একটি সহজ "অসম্ভব" ফাংশন হবে fubar :: a -> b, তাই না? (হ্যাঁ, আমি অবগত আছি I unsafeCoerceআমি ধরে নিয়েছি আমরা এর নামে "অনিরাপদ" দিয়ে কোনও বিষয়ে কথা বলছি না, এবং নতুনদেরও এটি নিয়ে উদ্বেগ করা উচিত নয়!: ডি)
আন্দ্রে এফ।

হ্যাঁ, আপনি লিখতে পারবেন না এমন সরল ধরণের স্বাক্ষর রয়েছে। উদাহরণস্বরূপ, foobar :: xবেশ অপরিহার্য ...
ম্যাথমেটিক্যালআরচিড

আসলে, আপনি খাঁটি কোড থ্রেড-অনিরাপদ তৈরি করতে পারবেন না , তবে আপনি এখনও এটি বহু-থ্রেডযুক্ত করতে পারেন। আপনার বিকল্পগুলি "আপনি এটি মূল্যায়ন করার আগে এটি মূল্যায়ন করুন", "আপনি যখন এটি মূল্যায়ন করেন, আপনি এটি আলাদা থ্রেডেও মূল্যায়ন করতে চাইতে পারেন", এবং "আপনি যখন এটি মূল্যায়ন করেন, আপনি সম্ভবত এটিও মূল্যায়ন করতে চাইতে পারেন একটি পৃথক থ্রেডে "। ডিফল্টটি হ'ল "আপনার ইচ্ছামতো করুন", যার মূল অর্থ "যতদূর সম্ভব দেরি করা" means
জন ডিভোরাক

আরও প্রকৃতপক্ষে আপনি ইন -1 বা ইন 2-তে উদাহরণ পদ্ধতিগুলি কল করতে পারেন যার পার্শ্ব প্রতিক্রিয়া রয়েছে। অথবা আপনি বিশ্বব্যাপী রাষ্ট্রটি (যা মঞ্জুর করেছেন, হাস্কেলকে আইও অ্যাকশন হিসাবে মডেল করা হয়েছে, তবে বেশিরভাগ লোকেরা আইও হিসাবে বিবেচনা করবেন না এমনটি হতে পারে) পরিবর্তন করতে পারেন।
ডগ ম্যাকক্লেয়ান

2
@ আইসোমরফিস্মস টাইপটি x -> y -> yপুরোপুরি বাস্তবায়িত। টাইপ (x -> y) -> yহয় না। প্রকারটি x -> y -> yদুটি ইনপুট নেয় এবং দ্বিতীয়টি প্রদান করে। টাইপটি (x -> y) -> yএমন একটি ফাংশন নেয় যা চালিত হয় x, এবং y
ম্যাথমেটিক্যালআরচিড

17

একটি সম্পর্কিত এসও প্রশ্ন

আমি ধরে নিয়েছি আপনি হ্যাসকেলে একই কাজ করতে পারবেন (অর্থাত্ স্ট্রিং / ইনটসে স্টাফ যা সত্যই প্রথম শ্রেণীর ডেটাটাইপস হওয়া উচিত)

না, আপনি সত্যিই পারবেন না - কমপক্ষে জাভা যেমনভাবে পারেন তেমন নয়। জাভাতে, এই ধরণের জিনিস ঘটে:

String x = (String)someNonString;

এবং জাভা খুশি হয়ে আপনার স্ট্রিং হিসাবে অ স্ট্রিংকে কাস্ট করবে cast রান্কটাইম ত্রুটিগুলির পুরো ক্লাসকে বাদ দিয়ে হাস্কেল এই ধরণের জিনিসটিকে অনুমতি দেয় না।

nullটাইপ সিস্টেমের অংশ (যেমন Nothing) তাই স্পষ্টভাবে জিজ্ঞাসা করা এবং পরিচালনা করা প্রয়োজন, রানটাইম ত্রুটিগুলির পুরো পুরো ক্লাসকে বাদ দিয়ে।

অন্যান্য সূক্ষ্ম সুবিধাগুলিও রয়েছে - বিশেষত পুনরায় ব্যবহার এবং টাইপ-শ্রেণীর চারপাশে - যে যোগাযোগ করার জন্য আমার যথেষ্ট দক্ষতা জানার মতো দক্ষতা আমার নেই।

বেশিরভাগ ক্ষেত্রেই, কারণ হ্যাস্কেলের টাইপ সিস্টেমটি প্রচুর পরিমাণে প্রকাশের অনুমতি দেয়। আপনি কয়েকটি কয়েকটি নিয়ম সহ পুরোপুরি স্টাফ করতে পারেন। সদা-উপস্থিত হাস্কেল গাছ বিবেচনা করুন:

data Tree a = Leaf a | Branch (Tree a) (Tree a) 

আপনি একটি সম্পূর্ণ জেনেরিক বাইনারি ট্রি (এবং দুটি ডেটা কনস্ট্রাক্টর) কোডের মোটামুটি পঠনযোগ্য এক লাইনে সংজ্ঞায়িত করেছেন। সমস্ত কিছু কয়েকটি বিধি ব্যবহার করে ( যোগফলের ধরণ এবং পণ্যের ধরণ )। এটি জাভাতে 3-4 কোড ফাইল এবং ক্লাস।

বিশেষত যারা প্রকারের ধরণের সিস্টেমের প্রতি শ্রদ্ধা পোষণ করেন তাদের মধ্যে এই ধরণের সংক্ষিপ্ততা / কমনীয়তা অত্যন্ত মূল্যবান।


আপনার উত্তর থেকে আমি কেবল নালপয়েন্টারএকটিপশন বুঝতে পেরেছি। আপনি আরও উদাহরণ অন্তর্ভুক্ত করতে পারেন?
জেসভিন জোস

2
অগত্যা সত্য নয়, জেএলএস §5.5.1 : টি টি যদি শ্রেণীর ধরণের হয় তবে হয় | এস | <: | টি |, বা | টি | <: | এস | অন্যথায়, একটি সংকলন-সময় ত্রুটি ঘটে। সুতরাং সংকলক আপনাকে অবিচ্ছিন্ন প্রকারের কাস্ট করতে দেয় না - এর চারপাশে স্পষ্টত উপায় রয়েছে ways
বরিস স্পাইডার

আমার মতে টাইপ ক্লাসগুলির সুবিধাগুলি রাখার সহজ উপায় হ'ল এগুলি interfaceএর মতো যা সত্যের পরে যুক্ত করা যেতে পারে, এবং তারা প্রয়োগ করে যা টাইপটি "ভুলে যায়" না। এটি হ'ল আপনি নিশ্চিত করতে পারেন যে কোনও ফাংশনে দুটি আর্গুমেন্ট একই ধরণের রয়েছে, interfaceযেখানে দুটি List<String>এর পৃথক বাস্তবায়ন থাকতে পারে s আপনি প্রতিটি ইন্টারফেসে টাইপ প্যারামিটার যুক্ত করে প্রযুক্তিগতভাবে জাভাতে খুব অনুরূপ কিছু করতে পেরেছিলেন, তবে 99% বিদ্যমান ইন্টারফেসগুলি এটি করে না এবং আপনি আপনার সমকক্ষদের মধ্যে থেকে নরকে বিভ্রান্ত করবেন।
ডোভাল

2
@BoristheSpider সত্য, কিন্তু ঢালাই ব্যতিক্রম প্রায় সবসময় একটি সুপারক্লাস থেকে একটি উপশ্রেণী অথবা একটি বর্গ একটি ইন্টারফেস থেকে downcasting জড়িত, এবং এটি অস্বাভাবিক সুপারক্লাস হতে জন্য নয় Object
ডোভাল

2
আমি মনে করি স্ট্রিং সম্পর্কিত প্রশ্নটির বিন্দু কাস্টিং এবং রানটাইম টাইপ ত্রুটিগুলির সাথে করা নয়, তবে আপনি যদি প্রকারগুলি ব্যবহার করতে না চান তবে জাভা আপনাকে তৈরি করবে না - যেমনটি আসলে আপনার ডেটা সিরিয়ালায়িতভাবে সংরক্ষণ করে রাখে ফর্ম, অ্যাড-হক anyপ্রকার হিসাবে স্ট্রিংগুলিকে আপত্তি জানায় । হাস্কেল আপনাকে এটি করা বন্ধ করবে না, যেহেতু ... ভাল, এর স্ট্রিং রয়েছে। হাস্কেল আপনাকে সরঞ্জাম দিতে পারে, আপনি যদি কোনও নেস্টেড প্রসঙ্গে পুনরায় উদ্দীপনার জন্য গ্রানস্পানিংয়ের পক্ষে পর্যাপ্ত দোভাষীর পক্ষে জোর করেন তবে এটি জোর করে বোকামি কাজ থেকে বিরত রাখতে পারে না null। কোন ভাষা পারে না।
লিউশেনকো

0

এর সাথে পরিচিত লোকেরা প্রায়শই যে 'মেমস' সম্পর্কে কথা বলেছিলেন তার মধ্যে একটি হ'ল পুরো "এটি যদি সংকলন করে তবে এটি কাজ করবে *" জিনিস - যা আমি মনে করি এটি টাইপ সিস্টেমের শক্তির সাথে সম্পর্কিত।

এটি ছোট প্রোগ্রামগুলির সাথে বেশিরভাগ ক্ষেত্রেই সত্য। হাস্কেল আপনাকে এমন ভুলগুলি করা থেকে বিরত রাখে যা অন্যান্য ভাষায় সহজ (যেমন একটি Int32এবং একটি Word32এবং কিছু বিস্ফোরিতের তুলনা করা ) তবে এটি আপনাকে সমস্ত ভুল থেকে বাধা দেয় না।

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

আমি বুঝতে চেষ্টা করছি কেন হাস্কেল এ ক্ষেত্রে অন্যান্য স্ট্যাটিক্যালি টাইপ করা ভাষার চেয়ে ভাল better

হাস্কেলের প্রকারগুলি মোটামুটি হালকা ওজনের, এতে নতুন প্রকারগুলি ঘোষণা করা সহজ। এটি রাস্টের মতো ভাষার বিপরীতে, যেখানে সবকিছুই কিছুটা জটিল।

আমার ধারনাটি হ'ল লোকে একটি শক্তিশালী টাইপ সিস্টেম বলতে বোঝায়, তবে কেন হাস্কেলের চেয়ে ভাল তা আমার কাছে স্পষ্ট নয়।

হাস্কেলের সাধারণ বৈশিষ্ট্য এবং পণ্যের ধরণের বাইরে অনেকগুলি বৈশিষ্ট্য রয়েছে; এটির সর্বজনীন পরিমাণযুক্ত প্রকারগুলি (যেমন id :: a -> a)ও রয়েছে। আপনি ফাংশন সম্বলিত রেকর্ড প্রকারগুলিও তৈরি করতে পারেন যা জাভা বা মরিচির মতো কোনও ভাষা থেকে একেবারেই আলাদা।

জিএইচসি একা টাইপের উপর ভিত্তি করে কিছু উদাহরণও অর্জন করতে পারে এবং জেনেরিক্সের আবির্ভাবের পরে, আপনি বিভিন্ন ধরণের জেনেরিক ফাংশন লিখতে পারেন। এটি বেশ সুবিধাজনক এবং জাভাতে এটির তুলনায় এটি আরও সাবলীল।

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

অবশেষে, হাস্কেলের টাইপক্লাস রয়েছে, তাদের মধ্যে বিখ্যাত মনাদ রয়েছে। ত্রুটিগুলি হ্যান্ডেল করার জন্য বিশেষভাবে এক সুন্দর উপায় হতে পারে; এগুলি nullহরিড ডিবাগিং ছাড়াই এবং আপনার কোনও ধরণের সুরক্ষা ছাড়াই মূলত আপনাকে প্রায় সমস্ত সুবিধা দেয়। সুতরাং যখন এইগুলি ব্যবহার করতে আমাদের উত্সাহিত করা হয় তখন এই ধরণের উপর ফাংশনগুলি লেখার ক্ষমতা আসলে কিছুটা গুরুত্বপূর্ণ হয়!

অন্য একটি উপায় রাখুন, আপনি ভাল বা খারাপ জাভা লিখতে পারেন, আমি ধরে নিয়েছি আপনি হাস্কেলতেও এটি করতে পারেন

এটি সম্ভবত সত্য, তবে এটি একটি গুরুত্বপূর্ণ বিষয়টি অনুপস্থিত: আপনি যখন জাভায় পায়ে নিজেকে শুটিং করতে শুরু করেছেন তখন হাস্কেলের পাদদেশে আপনি যে বিন্দুতে নিজেকে গুলি করতে শুরু করেছেন সেই বিন্দুটি ছাড়াই আরও রয়েছে।

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