গো ভাষার জন্য হিন্ডলি-মিলনার অনুমান কাজ করতে পারে?


22

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

সুতরাং, হ্যান্ডলি-মিলনার সূচনা কি হ্যাস্কেলের মতো নীতিগতভাবে একইভাবে কাজ করতে পারে? বা গো এর অন্যান্য বৈশিষ্ট্য রয়েছে যা এটি ভেঙে দেয়? (অন্যদিকে, হাস্কেলের কিছু বৈশিষ্ট্যও রয়েছে যা হিন্দি-মিলনার সাথে কাজ করে না, যদি আপনি নিজের প্রোগ্রামের সেই অংশগুলি ম্যানুয়ালি টাইপ করতে হয় তবে এটি ব্যবহার করেন))

উত্তর:


35

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

হতাশাজনক সীমাবদ্ধতার সাথে, এইচএম-স্টাইলের ধরণের অনুমিতি অসম্ভব। অবিরত কোডটি দেখুন:

func f(a) {
  return a.method()
}

কি ধরণের f? আমরা লক্ষ্য হতে পারে aএকটি পদ্ধতি থাকা আবশ্যক, তাই আমরা একটি বেনামী ইন্টারফেস ব্যবহার করতে পারে: func f(a interface { method() ??? }) ???। তবে, রিটার্নের ধরন কী তা আমাদের কোনও ধারণা নেই। প্রকারের ভেরিয়েবলের সাহায্যে আমরা প্রকারটি ঘোষিত করতে পারি

func f[T](a interface{ method() T }) T

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

পরিবর্তে, গো এর জন্য প্রয়োজনীয় যে ফাংশনগুলি সর্বদা সম্পূর্ণ ঘোষিত হয়, তবে ভেরিয়েবলগুলিকে টাইপ ইনফারেন্স ব্যবহার করতে দেয়। এটি সম্ভব কারণ variable := expressionপ্রোগ্রামের সেই মুহুর্তে একটি অ্যাসাইনমেন্টের ডান হাতের ইতিমধ্যে একটি পরিচিত টাইপ রয়েছে। এই জাতীয় ধরণের অনুমান সহজ, সঠিক এবং লিনিয়ার।

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

24
@ বিশপ এটি "কারণ" এর অসীম স্বল্প মানের জন্য "যুক্তিযুক্ত"।
hobbs

18
@ বিশপ জেনেরিকের সাথে ভাষাগুলিতে সংকলক কাজ করার পরে আমি অবশ্যই একমত হতে পারি: বাস্তবায়নটিকে উল্লেখযোগ্যভাবে জটিল না করে বাস্তবায়ন করা কঠিন। আমি এমনকি "অসম্ভব" দিয়ে "কঠিন" প্রতিস্থাপন করতে এতদূর যেতে চাই। তবে, বিষয়টি এমন নয়; মুল বক্তব্যটি কী এটি অতিরিক্ত জটিলতার পক্ষে মূল্যবান? এবং জেনারিকের সাথে এবং তার বাইরে কাজ করা যে কারও উত্তর, অবশ্যই "হ্যাঁ, অবশ্যই!" আমাকে জেনেরিক প্রয়োগ করতে অস্বীকার করা হয়েছে বলে দাবিটির সাথে আন্তরিকভাবে একমত হতে হবে কারণ "ওহ না, জটিলতা" বোকা।
ম্যাসন হুইলারের

18
এ কারণেই গো ডেভস সমস্ত প্রকারের এফপি খারাপ বলে ভান করে; যান আভিধানিক বন্ধ সঙ্গে প্রথম শ্রেণীর ফাংশন আছে, এবং যে উচ্চতর-অর্ডার ফাংশন তৈরি করার ক্ষমতা, কিন্তু এটা তাদের কোন কল্যাণ ব্যবহার করা অসম্ভব সঙ্গে কারণ মৌলিক ফাংশন ধরনের map, filterএবং reduceসব যান খুব সীমিত মধ্যে অবর্ণনীয় হয় টাইপ সিস্টেম।
hobbs

9
@ হোবস এবং গো সত্যিই দুর্দান্ত ভাষা হতে পারে যদি এটি ঠিক করা হত তবে পরিবর্তে লোকেরা জেনেরিক-প্রজন্মের লাইব্রেরি লিখতে হবে gengenএবংgonerics
বিড়াল

14
@ কেট এটি লজ্জাজনক। প্রথমে গোটা দুর্দান্ত ধারণাগুলি পূর্ণ একটি দুর্দান্ত ভাষার মতো বলে মনে হচ্ছে তবে তারপরে আপনি বুঝতে পারেন যে এর কোনও উত্তরাধিকার এবং বহুমুখিতা নেই, সুতরাং আপনি ওওপি ভাল করতে পারবেন না, এবং এর কোনও জেনেরিক নেই, তাই আপনি এফপি ভাল করতে পারবেন না, এবং আপনি 'জিজ্ঞাসা করে পর্দায় ফাঁকা দিশা ছেড়ে চলেছি "তাহলে আপনি এই ভাষাটি কীভাবে ব্যবহার করবেন বলে মনে করছেন?!?"
ম্যাসন হুইলার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.