निम्नलिखित वर्ग होने

class Foo[F[_]]

मैं संवर्धन विशेषता लागू करना चाहता हूं

trait EnrichedFoo extends Foo[_]

लेकिन यह टाइपिंग त्रुटि देता है:

error: _$1 takes no type parameters, expected: one
  trait EnrichedFoo extends Foo[_]
                                ^

रनिंग उदाहरण: https://scalafiddle.io/sf/CkMwDSi/0

संपादित करें:

क्यों? मैं एक ऐसा संवर्धन चाहता हूं जो किसी भी परम मूल्य के लिए काम करे, इसलिए मैं कुछ इस तरह लिख सकता हूं:

class MyFoo extends Foo[List] with EnrichedFoo

मुझे Foo का विस्तार करना है क्योंकि मैं इसके कुछ तरीकों को ओवरराइड करने में सक्षम होना चाहता हूं, इसलिए EnrichedFoo स्वयं प्रकार नहीं हो सकता (यदि यह किसी भी तरह से मदद करता है)।

2
Krever 4 जुलाई 2018, 08:41

3 जवाब

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

यदि आप निम्नलिखित की घोषणा करते हैं:

trait Foo {
  type HK[F]
}

trait EnrichedFoo1 extends Foo {
  def enrich1 : Unit = ???
}
trait EnrichedFoo2 extends Foo {
  def enrich2 : Unit = ???
}

abstract class FooClass[HK0[_]] extends Foo {
  type HK[F] = HK0[F]
}

तब उपयोगकर्ता कर सकता है:

class MyFoo1 extends FooClass[List] with EnrichedFoo1
class MyFoo2 extends FooClass[List] with EnrichedFoo2
class MyFoo12 extends FooClass[List] with EnrichedFoo1 with EnrichedFoo2
2
Oron Port 4 जुलाई 2018, 17:44

जब आप साधारण लोगों के साथ नहीं कर सकते तो आप उच्च-किंडर पैरामीटर के साथ ऐसा क्यों कर पाएंगे? यदि आपके पास है

class Bar[A] ...

class Baz extends Bar

यह केवल Bar के प्रकार पैरामीटर के लिए सामान्य प्रकार का अनुमान करेगा, इसलिए यह class Baz extends Bar[Nothing] के बराबर है।

मुझे फू का विस्तार करना है क्योंकि मैं इसकी कुछ विधियों को ओवरराइड करने में सक्षम होना चाहता हूं, इसलिए EnrichedFoo स्वयं प्रकार नहीं हो सकता है (यदि यह किसी भी तरह से मदद करता है)।

इन विधियों में F का उल्लेख नहीं किया जा सकता है, या आप EnrichedFoo में उनके हस्ताक्षर भी नहीं लिख सकते हैं, है ना? तो क्यों न Foo को दो भागों में विभाजित किया जाए:

trait FooBase {
  // methods not mentioning F
}

trait Foo[F[_]] extends FooBase {
  // other methods
}

trait ExtendedFoo extends FooBase { self: Foo[F] forSome { type F[_] } => 
  // method overrides
}
2
Alexey Romanov 4 जुलाई 2018, 10:34

आपको कंक्रीट क्लास/ट्रेट को Foo में टाइप कंस्ट्रक्टर * -> * के साथ पास करना होगा, जिसका अर्थ है कि यह टाइप और रिटर्न टाइप लेता है, उदा। List, मान लें, Int टाइप पैरामीटर के रूप में लेता है और रिटर्न टाइप List[Int] करता है।

class Foo[F[_]]
trait EnrichedFoo extends Foo[List]
1
Duelist 4 जुलाई 2018, 09:03