मैं निराकार को समझने के लिए कोशिश कर रहा हूँ, और मैं इस पार आया:एक वस्तु के बजाय 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 लिख सकते हैं' Nat 'और' टाइप _0 = _0.type' टाइप करें ' – laughedelic