2014-06-10 5 views
7

मैं निराकार को समझने के लिए कोशिश कर रहा हूँ, और मैं इस पार आया:एक वस्तु के बजाय ap Nat में बेकार वर्ग क्यों है?

// Base trait for type level natural numbers. 
trait Nat { 
    type N <: Nat 
} 

// Encoding of successor. 
case class Succ[P <: Nat]() extends Nat { 
    type N = Succ[P] 
} 

// Encoding of zero. 
class _0 extends Nat { 
    type N = _0 
} 

_0 एक विशेष और अद्वितीय मामले में, एक List के लिए Nil की तरह है। _0 कोई पूर्ववर्ती नहीं है। यह ऑब्जेक्ट/केस ऑब्जेक्ट क्यों नहीं है (जो सिंगलटन है)? HList रों यह करने के लिए लग रहे हैं:

// `HList` ADT base trait. 
sealed trait HList 

// Non-empty `HList` element type. 
final case class ::[+H, +T <: HList](head : H, tail : T) extends HList { 
    override def toString = head+" :: "+tail.toString 
} 

// Empty `HList` element type. 
sealed trait HNil extends HList { 
    def ::[H](h : H) = shapeless.::(h, this) 
    override def toString = "HNil" 
} 

// Empty `HList` value. 
case object HNil extends HNil 

उत्तर

0

(बस अनुमान लगा, मैं मूल कारण पता नहीं है।)

हो सकता है कि इतना है कि एक प्रकार_0 उपलब्ध है (यह स्पष्ट रूप से def fun[N <: Nat] = ???; fun[_0] में पारित करने के लिए की तरह , या इस प्रकार के बारे में निहितार्थ परिभाषित करने के लिए और अधिक सरल)।

यदि _0 एक सिंगलटन होता, तो केवल _0.type टाइप किया गया होता।

और HNil के लिए एक ही चीज़?

+1

यह एक अच्छा कारण नहीं है कि इसे सिंगलटन प्रकार न बनाएं। आप जिस सुविधा के बारे में बात कर रहे हैं, उसके लिए, आप बस 'केस ऑब्जेक्ट _0 लिख सकते हैं' Nat 'और' टाइप _0 = _0.type' टाइप करें ' – laughedelic

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