2015-02-23 2 views
9

मैं वर्तमान में स्काला सीख रहा हूँ, और इस हास्केल बीजीय डेटा प्रकार को दोहराने के लिए चाहता था:क्या एक प्रकार पैरामीटर के साथ 'केस ऑब्जेक्ट' का उपयोग करना संभव है?

sealed trait Tree[T] 
case class Empty[T]() extends Tree[T] 
case class Leaf[T](value: T) extends Tree[T] 
case class Node[T](left: Tree[T], right: Tree[T]) extends Tree[T] 

हालांकि, किसी ने मुझे कि मुझे बताया गया है:

data Tree = Empty 
      | Leaf Int 
      | Node Tree Tree 

यह है कि मैं क्या स्काला में लेकर आए हैं Empty के लिए case object का उपयोग करना चाहिए, जो मुझे लगता है कि यह सच है क्योंकि यह पैरामीटर नहीं लेता है - लेकिन फिर इसे एक प्रकार पैरामीटर की आवश्यकता होती है।

मैंने कोशिश की निम्नलिखित लेकिन उनमें से कोई संकलन:

case object Empty[T] extends Tree[T] 
case object Empty extends Tree[T] 
case object Empty extends Tree 

इसलिए मैं अगर वहाँ एक तरह से इस उदाहरण में है या नहीं case object उपयोग करने के लिए सोच रहा हूँ।

+6

एक सिंगलटन में टाइप पैरामीटर नहीं हो सकता है। शायद आप 'केस ऑब्जेक्ट चाहते हैं खाली खाली पेड़ [कुछ भी नहीं] ' –

+3

' केस ऑब्जेक्ट खाली पेड़ [कुछ भी नहीं] 'बढ़ाता है, क्योंकि' कुछ भी नहीं 'हर दूसरे प्रकार का उप-प्रकार है। –

+0

व्याख्यात्मक टिप्पणियों के लिए धन्यवाद! –

उत्तर

12

एक सिंगलटन सामान्य नहीं हो सकता क्योंकि उनमें से केवल एक ही है। आप Tree चाहते हैं covariant जा करने के लिए (अर्थात Tree[Int]Tree[Any] की एक उप-प्रकार है), तो आप प्रकार के रूप में

sealed trait Tree[+T] 
case object Empty extends Tree[Nothing] 

अन्यथा, परिभाषित कर सकते हैं एक मामले वर्ग के रूप में छोड़।

+3

शायद प्रतिमान उदाहरण को लिंक करें। https://github.com/scala/scala/blob/v2.11.5/src/library/scala/Option.scala#L345 –

संबंधित मुद्दे