স্কালার অপরিবর্তনীয় সেট কেন সমপরিমাণ নয়?


94

সম্পাদনা : মূল উত্তরের ভিত্তিতে এই প্রশ্নটি পুনরায় লিখেছেন

scala.collection.immutable.Setবর্গ এর ধরন প্যারামিটারে covariant করা হয় না। কেন?

import scala.collection.immutable._

def foo(s: Set[CharSequence]): Unit = {
    println(s)
}

def bar(): Unit = {
   val s: Set[String] = Set("Hello", "World");
   foo(s); //DOES NOT COMPILE, regardless of whether type is declared 
           //explicitly in the val s declaration
}

এটি লক্ষ করার মতো যে foo(s.toSet[CharSequence])জরিমানা সংকলন করে। toSetএটা শুধু গোপন - পদ্ধতি হে (1) হয় asInstanceOf
জন সোলিভান

4
এছাড়াও নোট করুন যে foo(Set("Hello", "World"))২.১০ তে খুব বেশি সংকলন করে, যেহেতু স্কালাকে সঠিক ধরণের সেটটি নির্ধারণ করতে সক্ষম বলে মনে হচ্ছে। যদিও এটি অন্তর্নিহিত রূপান্তরগুলি নিয়ে কাজ করে না ( স্ট্যাকওভারফ্লো . com / জিজ্ঞাসা / 23274033/… )।
এলপি_

উত্তর:


55

Setফাংশন হিসাবে সেটগুলির পিছনে ধারণার কারণে এটির টাইপ প্যারামিটারে অবিচ্ছিন্ন। নিম্নলিখিত স্বাক্ষরগুলিতে কিছুটা বিষয় পরিষ্কার করা উচিত:

trait Set[A] extends (A=>Boolean) {
  def apply(e: A): Boolean
}

যদি Setসহকারী হন Aতবে applyপদ্ধতিটি Aকার্যকারিতাগুলির দ্বন্দ্বের কারণে কোনও পরামিতি টাইপ করতে অক্ষম হবে । Setসম্ভাব্য হতে পারে contravariant মধ্যে A, কিন্তু এই খুব সমস্যা ঘটায় যখন আপনি এই মত কাজগুলি করতে চাই:

def elements: Iterable[A]

সংক্ষেপে, সর্বোত্তম সমাধান হ'ল অপরিবর্তনীয় ডেটা কাঠামোর জন্যও জিনিসগুলিকে অচল করে রাখা। আপনি দেখতে পাবেন যে immutable.Mapএটির যে কোনও একটির পরামিতিগুলিতেও আক্রমণাত্মক।


4
আমার ধারণা এই যুক্তিটি "ফাংশন হিসাবে সেটগুলির পিছনে ধারণা" এর চারপাশে জড়িত - এটি কি আরও বাড়ানো যেতে পারে? উদাহরণস্বরূপ, "ফাংশন হিসাবে একটি সেট" আমাকে "সংগ্রহ হিসাবে সেট" না দিয়ে কী সুবিধা দেয়? C কোভেরিয়েন্ট ধরণের ব্যবহারটি কি হারাতে হবে?
অক্সবো_লাক্স

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

6
গাণিতিক দৃষ্টিকোণ থেকে সেটগুলি বুলিয়ান ফাংশন নয়। কিছু অন্তর্ভুক্তির ক্রিয়াকলাপ দ্বারা হ্রাস না করা জেরেমো-ফ্রেইঙ্কেল অ্যাকিমিয়ামগুলি থেকে সেটগুলি "বিল্ট আপ" হয় । এর পেছনের কারণটি রাসেলের প্যারাডক্স: যদি কোনও কিছু সেটের সদস্য হতে পারে, তবে সেটের সেট আর কে বিবেচনা করুন যা নিজের সদস্য নয়। তাহলে প্রশ্ন জিজ্ঞাসা করুন, আর কি আর এর সদস্য?
অক্সবো_লেকস

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

4
@Martin: তালিকা করা হয়ে থাকে কারণ পদ্ধতি কোন লাগে, না এ ধরনের List(1,2,3).contains _হয় (Any) => Boolean, যখন ধরণ Set(1,2,3).contains _হয় res1: (Int) => Boolean
শেঠ তিশু

52

http://www.scala-lang.org/node/9764 মার্টিন Odersky লিখেছেন:

"সেটগুলির ইস্যুতে, আমি বিশ্বাস করি যে অ-বৈকল্পিকতা বাস্তবায়নগুলি থেকেও ঘটে Common সাধারণ সেটগুলি হ্যাশটবল হিসাবে প্রয়োগ করা হয়, যা মূল ধরণের নন-ভেরিয়েন্ট অ্যারে I আমি সম্মতি জানাই এটি সামান্য বিরক্তিকর অনিয়ম।"

সুতরাং, দেখে মনে হচ্ছে এটির জন্য মূলত কারণ গঠনের আমাদের সমস্ত প্রচেষ্টা বিপথগামী ছিল :-)


4
তবে কিছু সিকোয়েন্সগুলি অ্যারে দিয়ে প্রয়োগ করা হয়, এবং এখনও Seqসমবায় রয়েছে ... আমি কি কিছু মিস করছি?
এলপি_

4
Array[Any]অভ্যন্তরীণভাবে সঞ্চয় করে এটি তুচ্ছভাবে সমাধান করা যেতে পারে ।
ডানফোল্ড

পছন্দ করুন যুক্তিসঙ্গত কারণ থাকতে পারে, তবে এটি তা নয়।
পল ড্রাগার

6

সম্পাদনা : যে কারও জন্য এই উত্তরটি কেন সামান্য অফ-টপিক হিসাবে মনে হচ্ছে তা ভাবছেন, কারণ আমি (প্রশ্নকারী) প্রশ্নটি পরিবর্তন করেছি।

স্কালার ধরণের অনুমিতি এটি নির্ধারণ করার জন্য যথেষ্ট যে আপনি কিছু পরিস্থিতিতে স্ট্রিংস না করেই চারসিকিউনেন্সগুলি চান। বিশেষত, নিম্নলিখিতগুলি আমার জন্য 2.7.3 এ কাজ করে:

import scala.collections.immutable._
def findCharSequences(): Set[CharSequence] = Set("Hello", "World")

কীভাবে অপরিবর্তনীয় তৈরি করতে হয় H সরাসরি হ্যাশসেটস: না। বাস্তবায়ন অপ্টিমাইজেশন হিসাবে, পরিবর্তনযোগ্য 5 5 টিরও কম উপাদানের হ্যাশসেটগুলি প্রকৃতপক্ষে অপরিবর্তনীয় উদাহরণ নয় ash হ্যাশসেট। তারা হয় এমপিটিসেট, সেট 1, সেট 2, সেট 3, বা সেট 4 Set এই ক্লাসগুলি সাবক্লাস অপরিবর্তনীয় S সেট, কিন্তু স্থাবর নয় ash হ্যাশসেট।


তুমি ঠিক; আমার প্রকৃত উদাহরণটি সরল করার চেষ্টা করতে গিয়ে আমি একটি তুচ্ছ ভুল করেছি :-(
অক্সবো_লাক
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.