স্কালায় `#` অপারেটরের অর্থ কী?


131

আমি এই ব্লগে এই কোডটি দেখছি: স্কালায় টাইপ-লেভেল প্রোগ্রামিং :

// define the abstract types and bounds
trait Recurse {
  type Next <: Recurse
  // this is the recursive function definition
  type X[R <: Recurse] <: Int
}
// implementation
trait RecurseA extends Recurse {
  type Next = RecurseA
  // this is the implementation
  type X[R <: Recurse] = R#X[R#Next]
}
object Recurse {
  // infinite loop
  type C = RecurseA#X[RecurseA]
}

কোডটিতে এমন একটি অপারেটর #রয়েছে R#X[R#Next]যা আমি কখনও দেখিনি। যেহেতু এটি অনুসন্ধান করা কঠিন (অনুসন্ধান ইঞ্জিনগুলি দ্বারা উপেক্ষা করা), এর অর্থ কী বলতে পারে আমাকে কে বলতে পারে?


1
"পাউন্ড সাইন "টিকে মাঝে মাঝে" অক্টথ্রপ "হিসাবে উল্লেখ করা হয় (যে গুগল অনুসন্ধানটি আমাকে এই পৃষ্ঠায় নিয়ে আসে)।
ফিলওয়াক


(দেখুন - # + এবং # মত Whatabout অন্যান্য অপারেটরদের github.com/tpolecat/doobie/blob/series/0.4.x/yax/h2/src/main/... )? একটি বিস্তৃত তালিকা আছে?
মার্কাস বার্থলেন

উত্তর:


240

এটি ব্যাখ্যা করার জন্য, আমাদের প্রথমে স্কালায় নেস্টেড ক্লাসগুলি ব্যাখ্যা করতে হবে। এই সহজ উদাহরণ বিবেচনা করুন:

class A {
  class B

  def f(b: B) = println("Got my B!")
}

এখন এটি দিয়ে কিছু চেষ্টা করুন:

scala> val a1 = new A
a1: A = A@2fa8ecf4

scala> val a2 = new A
a2: A = A@4bed4c8

scala> a2.f(new a1.B)
<console>:11: error: type mismatch;
 found   : a1.B
 required: a2.B
              a2.f(new a1.B)
                   ^

আপনি যখন স্কালার অন্য শ্রেণীর অভ্যন্তরে কোনও ক্লাস ঘোষণা করেন, আপনি বলছেন যে class শ্রেণির প্রতিটি উদাহরণে একটি সাবক্লাস রয়েছে। অন্য কথায়, কোনও A.Bশ্রেণি নেই, তবে রয়েছে a1.Bএবং a2.Bক্লাসগুলি, এবং সেগুলি পৃথক শ্রেণি, যেমন ত্রুটি বার্তা আমাদের উপরে বলেছে।

যদি আপনি এটি বুঝতে না পারেন তবে পথ নির্ভর প্রকারগুলি দেখুন।

এখন, #আপনার পক্ষে কোনও নির্দিষ্ট ক্ষেত্রে সীমাবদ্ধ না রেখে এ জাতীয় নেস্ট ক্লাসগুলি উল্লেখ করা সম্ভব করে তোলে। অন্য কথায়, নেই A.B, তবে আছে A#B, যার অর্থ কোনও উদাহরণের Bনেস্টেড বর্গ ।A

উপরের কোডটি পরিবর্তন করে আমরা এটি কাজ করে দেখতে পারি:

class A {
  class B

  def f(b: B) = println("Got my B!")
  def g(b: A#B) = println("Got a B.")
}

এবং এটি চেষ্টা করে দেখুন:

scala> val a1 = new A
a1: A = A@1497b7b1

scala> val a2 = new A
a2: A = A@2607c28c

scala> a2.f(new a1.B)
<console>:11: error: type mismatch;
 found   : a1.B
 required: a2.B
              a2.f(new a1.B)
                   ^

scala> a2.g(new a1.B)
Got a B.

দুর্দান্ত উদাহরণ। আমি সম্পূর্ণরূপে স্বীকার করি যে এটি সেভাবে কাজ করে তবে এটি বোঝা শক্ত: স্কেল> শ্রেণীঅফ [এ # বি] রেজি 7: শ্রেণি [এ # বি] = শ্রেণি $ বি স্কালা> শ্রেণিফ [এবি] রেজি 8: শ্রেণি [এবি] = শ্রেণি এ । খ। যার অর্থ, তাদের আসলে একই ধরণের আছে?
চিরন

2
তাদের মানগুলির একই স্ট্রিং প্রতিনিধিত্ব রয়েছে - এবং তারা সমানও হতে পারে। Classএটি জাভা ক্লাসগুলির একটি রানটাইম উপস্থাপনা এবং এটি জাভাতেও সীমাবদ্ধ। উদাহরণস্বরূপ, List<String>এবং List<Integer>একই রানটাইম আছে Classজাভা ধরণের Classউপস্থাপনের জন্য যদি যথেষ্ট সমৃদ্ধ না হয় তবে স্কালার প্রকারগুলি উপস্থাপন করার সময় এটি প্রায় অকেজো । আবার, সমান চিহ্নের বাম হ'ল এক প্রকারের সমান প্রকারের ডান যদি কোনও মান যা কোনও শ্রেণীর জাভা রানটাইম উপস্থাপনা। res7: Class[A#B] = class A$B
ড্যানিয়েল সি

13

এটি টাইপ প্রজেকশন হিসাবে পরিচিত, এবং টাইপ সদস্যদের অ্যাক্সেস করতে ব্যবহৃত হয়।

scala> trait R {
     |   type A = Int
     | }
defined trait R

scala> val x = null.asInstanceOf[R#A]
x: Int = 0

6
এটি একটি উত্তর নেই। এটি মূলত প্রশ্নের মতো একই কোডটি দেখায়, কিছুটা ছোট করা। উদাহরণস্বরূপ চিহ্নিতকরণের মধ্যে পার্থক্য কী? আমি এই আসল কোডে কোথায় ব্যবহার করব?
notan3xit

2
@ notan3xit সম্ভবত আপনি যা জিজ্ঞাসা করতে চেয়েছিলেন এটি একটি উত্তর নেই। তবে আপনি যা জিজ্ঞাসা করেছিলেন তা হ'ল "... যা আমি কখনই দেখিনি Since যেহেতু এটি অনুসন্ধান করা কঠিন (অনুসন্ধান ইঞ্জিন দ্বারা উপেক্ষা করা), তবে এর অর্থ কী? আমাকে কে বলতে পারে?"
এনএফজি


2

"প্রতীকী অপারেটরগুলি" (যা সত্যই পদ্ধতিগুলি) অনুসন্ধান করার জন্য এখানে একটি সংস্থান রয়েছে, তবে স্কেলেক্সে অনুসন্ধান করার জন্য কীভাবে "#" এড়াতে হবে তা আমি খুঁজে পাইনি)

http://www.artima.com/pins1ed/book-index.html#indexanchor

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