Scala 为什么_0nat在Shapeless中是一个类而不是一个对象?

Scala 为什么_0nat在Shapeless中是一个类而不是一个对象?,scala,functional-programming,shapeless,hlist,Scala,Functional Programming,Shapeless,Hlist,我试图理解Shapess,我发现: // 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 }

我试图理解Shapess,我发现:

// 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
}
(只是猜测,我不知道最初的原因。)


可能是这样的,一个类型
\u 0
是可用的(要像
def fun[N中那样显式地传递它,不将其设为单例类型不是一个好理由。为了方便起见,您可以只编写
case object\u 0扩展Nat
type\u 0=\u 0.type
// `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