स्काला में `#` ऑपरेटर का क्या अर्थ है?


131

मैं इस ब्लॉग में इस कोड को देखता हूं: Scala में टाइप-स्तरीय प्रोग्रामिंग :

// 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
"पाउंड साइन" को कभी-कभी "ऑक्टैथ्रोप" के रूप में संदर्भित किया जाता है (जो कि Google खोज ने मुझे इस पृष्ठ पर लाया)।
दार्वाक


व्हाटआउट अन्य ऑपरेटरों जैसे # + और # - ( 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)
                   ^

जब आप स्काला में किसी अन्य वर्ग के अंदर एक वर्ग घोषित करते हैं, तो आप कह रहे हैं कि उस वर्ग के प्रत्येक उदाहरण में ऐसा उपवर्ग है। दूसरे शब्दों में, कोई 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.

बहुत बढ़िया उदाहरण है। मैं पूरी तरह से स्वीकार करता हूं कि यह इस तरह से काम करता है लेकिन इसे समझने में मुश्किल है: scala> classOf [A # B] res7: Class [A # B] = class A $ B scala> classOf [aB] res8: कक्षा [aB] = वर्ग A $ ब। जिसका मतलब है, उनके पास वास्तव में एक ही प्रकार है?
चिरोन

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 शायद यह एक गैर जवाब है कि आप क्या पूछना चाहते हैं। लेकिन आपने जो पूछा है "... जो मैंने कभी नहीं देखा है। चूंकि इसे खोजना मुश्किल है (खोज इंजन द्वारा अनदेखा), जो मुझे बता सकते हैं कि इसका क्या मतलब है?"
nafg


2

यहां "प्रतीकात्मक संचालकों" (जो वास्तव में विधियां हैं) पर खोज करने के लिए एक संसाधन है, लेकिन मुझे पता नहीं चला है कि स्केल में खोज करने के लिए "#" से कैसे बचा जाए)

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.