में टाइपक्लास और विरासत समस्या को परिभाषित करने का यह दूसरा प्रयास है, मैं इसके चारों ओर अपना सिर नहीं प्राप्त कर सकता।स्कालज़
मैं बीजगणितीय प्रकार को परिभाषित करने और उस पर एक साधारण टाइपक्लास परिभाषित करने में सक्षम होना चाहता हूं, मान लें कि Show
। हास्केल में मुझे क्या करना:
data Tree a = EmptyTree | Node a deriving (Show)
अब, अगर मैं EmptyTree
टाइप - Haskell यह दिखा सकते हैं, तो यह Show
के अंतर्गत आता है।
अब मैं स्केला में भी ऐसा ही करने की कोशिश कर रहा हूँ:
sealed abstract class Tree[+T]
case object EmptyTree extends Tree[Nothing]
case class Node[T](value: T) extends Tree[T]
तो मैं उसके चारों ओर Show
को परिभाषित:
implicit def show[T] = Show.showA[Tree[T]]
मैं println((EmptyTree : Tree[Int]).show)
कर सकते हैं। लेकिन मैं ऐसा नहीं कर सकते println(EmptyTree.show)
(प्रतिक्रिया value show is not a member of object EmptyTree
है)
मैं अतिरिक्त लिखने के लिए है:
implicit class MyShowOps[A, +T <: Tree[A]](t: T) {
def showMy(implicit ev: Show[Tree[A]]): String = ev.shows(t)
}
और उसके बाद ही मैं क्या कर सकते हैं println(EmptyTree.showMy)
यह अभी भी सही नहीं है, तो मेरा मानना है कि या तो मैं गलत काम करने की कोशिश कर रहा हूं और मुझे Show
को इस तरह लागू नहीं करना चाहिए और मुझे अपने निर्माण का उपयोग केवल Tree[T]
के रूप में करना चाहिए या मुझे स्कालाज़ से उचित निर्माण याद आ रहा है।
मैंने स्केलज़ स्रोतों में 'वैल खाली ट्री: ट्री [कुछ भी नहीं] .. जैसे पैटर्न देखा है, लेकिन यह समझ में नहीं आया कि ऐसा क्यों किया गया। अब यह मुझे स्पष्ट है। अभी भी कुछ ऐसा नहीं है जो मुझे समझ में नहीं आता है, क्या कोई विशेष कारण है कि स्केलज़ 'शोओप्स' को परिभाषित नहीं किया गया था जैसा मैंने किया था? यह 'खाली ट्री' और 'नोड [टी] ' – Archeg
जैसे रैपर विधियों को परिभाषित करने से सरल लगता है। उप-कास्टिंग कन्स्ट्रक्टर पैटर्न बोर्ड में इन मुद्दों में से कई मुद्दों को हल करता है, जबकि उपप्रकारों के उदाहरण प्रदान करने से टन पर असर पड़ता है कोड का सामान्य रूप से स्कालज़ उप-प्रकार को समायोजित करने के अपने रास्ते से बाहर नहीं जाता है (उदाहरण के लिए अधिकांश प्रकार के वर्ग आविष्कार होते हैं और उपप्रकारों के लिए उदाहरण प्रदान नहीं किए जाते हैं)। –