मैं डर में पढ़ रहा हूं कि स्कैला 3 के साथ क्या आएगा, कंपाउंड प्रकारों में बदलाव पर विशेष ध्यान दे रहा है। वे हमेशा कुछ हद तक एक हैक थे, इसलिए साफ, सच्चे चौराहे के प्रकार निश्चित रूप से एक सुधार हैं। हालांकि यौगिक प्रकार के वास्तविक शोधन भाग के साथ क्या होता है, इसके बारे में मुझे कुछ भी नहीं मिला। मैं अपने वर्तमान प्रोजेक्ट में दृढ़ता से इंटरवॉवन प्रकारों पर बहुत अधिक भरोसा करता हूं ताकि प्रत्येक लौटा मूल्य जितना संभव हो सके संकीर्ण हो। तो, उदाहरण के लिए, होने

trait Thing { thisThing =>
    type A
    type B
    type C

    def something :Thing { 
        type A = <related to thisThing.A> 
        type B <: <related to thisThing.B>
        type C = <etc>
    }

क्या यह अभी भी संभव है? नए शब्दार्थ के साथ इस लक्ष्य को कैसे प्राप्त करें? जैसा कि मैं समझता हूं, अमूर्त प्रकारों के परिशोधन की लगभग निश्चित रूप से अनुमति नहीं होगी, इसलिए एक प्रकार के पदानुक्रम की जड़ में 'स्वयं प्रकार' घोषणा करना मुश्किल होगा:

trait Thing {
    type ThisThing <: Thing
    type A
    type B
    def copy(...) :ThisThing { type A = ...; type B = ... }
}

कुछ हद तक संबंधित नोट पर, मैं संरचनात्मक प्रकारों को देख रहा था। मुझे कहना होगा कि मुझे यह पसंद है कि हम स्थिर घोषणाओं के साथ गतिशील सदस्य चयन/कार्यान्वयन कैसे कर सकते हैं। क्या यह अमूर्त वर्गों के लिए संभव है? क्या मैं कुछ ऐसा लिख ​​सकता हूँ:

trait Record(members :(String, Any)*) extends Selectable { ... }

val r = new Record { val name :String; val age :Int }

संपादित करें: मुझे दस्तावेज़ीकरण का सापेक्ष बिट मिला और ऐसा लगता है कि अनाम Selectable इंस्टेंस को नियम से छूट दी गई है कि एक अनाम वर्ग का प्रकार इसके विस्तारित प्रकारों का प्रतिच्छेदन है - अच्छा।

2
Turin 26 सितंबर 2020, 16:13

1 उत्तर

सबसे बढ़िया उत्तर

जैसा कि मैं समझता हूं, अमूर्त प्रकारों के परिशोधन की लगभग निश्चित रूप से अनुमति नहीं दी जाएगी ...

type A <: {
  type U
}

trait B {
  type T <: A
}

object o extends B {
  type T = A { type U = Int }
}

पूरी तरह से संकलित।

https://scastie.scala-lang.org/Nbz3GxoaTSe3VhXZz406vQ

अमूर्त प्रकार T#U के प्रकार अनुमानों की अनुमति नहीं है

trait B {
  type T <: A
  type V = T#U // B.this.T is not a legal path since it is not a concrete type
}

https://scastie.scala-lang.org/xPylqOOkTPK9CvWyDdLvsA

http://dotty.epfl.ch/docs/reference/dropped-features/type-projection.html

शायद आपका मतलब था कि

type A {
  type U
}

पार्स करने योग्य नहीं है। लेकिन स्कैला 2 में यह या तो नहीं है। सही है या तो

trait A {
  type U
}

या

type A <: {
  type U
}
4
Dmytro Mitin 26 सितंबर 2020, 19:04