8

私は 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これを行うようです:

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

1 に答える 1

0

(推測で、本当の理由はわかりません。)

おそらく、 _0が利用可能になるようにするためです ( in のように明示的に渡すためdef fun[N <: Nat] = ???; fun[_0]、またはより単純にこの型に関する暗黙の定義を行うため)。

_0シングルトンだった場合、タイプのみ_0.typeが利用可能でした。

そして同じことHNil

于 2014-07-21T19:03:04.880 に答える