【问题标题】: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 是一个特殊且独特的情况,例如NilList_0 没有前任。为什么它不是一个对象/案例对象(它是一个单例)? HLists 似乎是这样做的:

// `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

【问题讨论】:

    标签: scala functional-programming shapeless hlist


    【解决方案1】:

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

    也许这样一个类型 _0 是可用的(像def fun[N &lt;: Nat] = ???; fun[_0] 一样显式传递它,或者更简单地定义这个类型的隐含)。

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

    HNil 也一样?

    【讨论】:

    • 不让它成为单例类型并不是一个很好的理由。为了方便您谈论,您可以写case object _0 Extends Nattype _0 = _0.type
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-12
    相关资源
    最近更新 更多