मैं स्कैला संग्रह के लिए कुछ एक्सटेंशन विधियों को लिखने की कोशिश कर रहा हूं, और पूरी तरह से उन्हें उत्पन्न करने में परेशानी में भाग रहा हूं।मैं IsTraversableLike में सदस्य ए प्रकार का उपयोग कैसे करूं?
tailOption पर एक पहला प्रयास की तरह कुछ पैदावार:
implicit class TailOption[A, Repr <: GenTraversableLike[A, Repr]](val repr: Repr) {
def tailOption: Option[Repr] =
if (repr.isEmpty) None
else Some(repr.tail)
}
दुर्भाग्य से, यह काम नहीं करता:
scala> List(1,2,3).tailOption
<console>:19: error: value tailOption is not a member of List[Int]
List(1,2,3).tailOption
स्काला 2.10 IsTraversableLike प्रकार स्तरीय बात की इस तरह अनुकूलन में मदद करने के प्रदान करता है सभी संग्रहों के लिए (अजीब लोगों सहित, स्ट्रिंग्स की तरह)।
इसके साथ ही मैं उदाहरण के लिए tailOption काफी आसानी से लागू कर सकते हैं:
implicit class TailOption[Repr](val r: Repr)(implicit fr: IsTraversableLike[Repr]) {
def tailOption: Option[Repr] = {
val repr = fr.conversion(r)
if (repr.isEmpty) None
else Some(repr.tail)
}
}
scala> List(1,2,3).tailOption
res12: Option[List[Int]] = Some(List(2, 3))
scala> "one".tailOption
res13: Option[String] = Some(ne)
परिणाम सही प्रकार की है: Option[<input-type>]
। विशेष रूप से, मैं Repr
प्रकार को संरक्षित करने में सक्षम हूं जो Repr
लौटने वाली विधियों को कॉल करते हैं, जैसे 'पूंछ।
दुर्भाग्य से, मैं संग्रह के तत्वों के प्रकार को संरक्षित करने के लिए इस चाल का उपयोग नहीं कर सकता। मैं उन तरीकों को कॉल नहीं कर सकता जो एक तत्व लौटाते हैं।
IsTraversableLike
में सदस्य ए है लेकिन यह बहुत उपयोगी प्रतीत नहीं होता है। विशेष रूप से मैं अपने मूल तत्व प्रकार का पुनर्निर्माण नहीं कर सकता हूं और सदस्य प्रकार के बराबर नहीं है। उदाहरण के लिए, आगे काम के बिना, headTailOption
इस तरह दिखता है:
implicit class HeadTailOption[Repr](val r: Repr)(implicit val fr: IsTraversableLike[Repr]) {
def headTailOption: Option[(fr.A, Repr)] = {
val repr = fr.conversion(r)
if (repr.isEmpty) None
else Some(repr.head -> repr.tail)
}
}
scala> val Some((c, _)) = "one".headTailOption
c: _1.fr.A forSome { val _1: HeadTailOption[String] } = o
हम देख सकते हैं, ग एक अद्भुत बारोक प्रकार है। लेकिन, इस प्रकार है चार के बराबर नहीं:
scala> val fr = implicitly[IsTraversableLike[String]]
fr: scala.collection.generic.IsTraversableLike[String] = [email protected]
scala> implicitly[fr.A <:< Char]
<console>:25: error: Cannot prove that fr.A <:< Char.
implicitly[fr.A <:< Char]
मैं Repr[A] <: GenTraversableLike[A, Repr[A]]
जिनमें से कोई भी मदद कर रहा सहित चाल के सभी प्रकार की कोशिश की है। किसी को भी बनाने के लिए मैजिक सॉस बाहर काम headTailOption
के लिए सही प्रकार लौट सकते हैं:
val headTailString: Option[(Char, String)] = "one".headTailOption
val headTailList: Option[(Int, List[Int])] = List(1,2,3).headTailOption
आपने मुझे इसे हराया। दुर्भाग्य से आश्रित विधि के बीच विभाजित विधि fr.A और प्रकार-पैरामीटरयुक्त वर्ग का उपयोग करना आवश्यक है, इसलिए मुझे विश्वास नहीं है कि एक अंतर्निहित वर्ग समाधान (वर्तमान में) संभव है। –
हां, मैं अब एक ही निष्कर्ष पर आया था। निहित वर्ग निर्भर प्रकार के आवश्यक प्रकार परिवर्तन/अनुमान को पुन: पेश करने में सक्षम नहीं है ... –