প্যাটার্ন মিলের ক্ষেত্রে পদ্ধতির অনুক্রম এবং শ্রেণীর ধরণের পরামিতিগুলির মধ্যে পার্থক্য


9

টাইপ প্যারামিটার একটি এনকোলেজিং ক্লাসের বিপরীতে কোনও এনকোলেজিং পদ্ধতি থেকে টাইপ প্যাটার্নটি কেন আলাদাভাবে কাজ করে? উদাহরণ স্বরূপ,

trait Base[T]
case class Derived(v: Int) extends Base[Int]

class Test[A] {
  def method(arg: Base[A]) = {
    arg match {
      case Derived(_) => 42
    }
  }
}

ত্রুটি দেয়

constructor cannot be instantiated to expected type;
 found   : A$A87.this.Derived
 required: A$A87.this.Base[A]
      case Derived(_) => 42
           ^

যখন এটি Aমেথড টাইপ পরামিতি হয় তখন এটি সফলভাবে সংকলন করে

class Test {
  def method[A](arg: Base[A]) = {
    arg match {
      case Derived(_) => 42
    }
  }
}

প্রশ্নটি ড্যানিয়েলের বিশ্লেষণের ভিত্তিতে , যা আমি অনুরূপ প্রশ্নের উত্তর দেওয়ার চেষ্টা করতাম ।

উত্তর:


4

আমার কাছে 100% সম্পূর্ণ উত্তর নেই তবে আমার কাছে এমন একটি পয়েন্টার রয়েছে যা আপনার পক্ষে যথেষ্ট।

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

স্কেলা 2 সংকলকটিতে বিশেষ জিএডিডি হ্যান্ডলিংয়ের সাধারণ উদাহরণটি আপনার ব্যবহারের ক্ষেত্রে খুব সম্পর্কিত। আমরা যদি একবার দেখে নিই:

def method[A](arg: Base[A]) = {
  arg match {
    case Derived(_) => 42
  }
}

এবং আমরা সুস্পষ্টভাবে রিটার্নের ধরনটি হ'ল ঘোষণা করি A:

def method[A](arg: Base[A]): A 

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

জিএডিডি (আমাদের ক্ষেত্রে A) এর জেনেরিক ধরণের পরামিতি কোথাও ঘোষণা করতে হবে। এবং এখানে আকর্ষণীয় অংশটি - বিশেষ সংকলক হ্যান্ডলিং কেবল তখনই কাজ করে যখন এটি বদ্ধকরণ পদ্ধতির ধরণের প্যারামিটার হিসাবে ঘোষণা করা হয় । যদি এটি কোনও টাইপ সদস্য বা ঘেরযুক্ত বৈশিষ্ট্য / শ্রেণীর কোনও ধরণের প্যারামিটার থেকে আসে তবে আপনি নিজের সাক্ষী হিসাবে এটি সংকলন করে না।

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

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