为什么无形的_0 Nat是一个类而不是一个对象?

时间:2014-06-10 17:08:46

标签: scala functional-programming shapeless hlist

我正在努力理解无形,我遇到了这个:

// 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是一个特殊且独特的案例,例如Nil List_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

1 个答案:

答案 0 :(得分:0)

(只是猜测,我不知道原因。)

也许这样类型 _0可用(如def fun[N <: Nat] = ???; fun[_0]中那样明确地传递它,或者更简单地定义关于此类型的暗示)。

如果_0是单身人士,则只有_0.type类型可用。

同样适用于HNil