为啥 Shapeless 中的 _0 Nat 是一个类而不是一个对象?
Posted
技术标签:
【中文标题】为啥 Shapeless 中的 _0 Nat 是一个类而不是一个对象?【英文标题】:Why is the _0 Nat in Shapeless a class instead of an object?为什么 Shapeless 中的 _0 Nat 是一个类而不是一个对象? 【发布时间】:2014-07-31 13:42:08 【问题描述】:我试图理解 Shapeless,但我遇到了这个:
// 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
s 似乎是这样做的:
// `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
是可用的(像def fun[N <: Nat] = ???; fun[_0]
一样显式传递它,或者更简单地定义这个类型的隐含)。
如果 _0
是单例,则只有类型 _0.type
可用。
HNil
也一样?
【讨论】:
不让它成为单例类型并不是一个很好的理由。为了方便您谈论,您可以写case object _0 Extends Nat
和type _0 = _0.type
以上是关于为啥 Shapeless 中的 _0 Nat 是一个类而不是一个对象?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Shapeless 从对象中获取 Option[T]