这是Nat
in package的定义shapeless
:
trait Nat {
type N <: Nat
}
case class Succ[P <: Nat]() extends Nat {
type N = Succ[P]
}
class _0 extends Nat with Serializable {
type N = _0
}
声明有什么type
用?在我看来,一旦删除,该定义同样适用。
这是Nat
in package的定义shapeless
:
trait Nat {
type N <: Nat
}
case class Succ[P <: Nat]() extends Nat {
type N = Succ[P]
}
class _0 extends Nat with Serializable {
type N = _0
}
声明有什么type
用?在我看来,一旦删除,该定义同样适用。
它们用于Nat
从文字隐式转换的目标类型在哪里Int
......例如,在索引方法的定义中,请参见此处,Int
HList
def at(n : Nat)(implicit at : At[L, n.N]) : at.Out = ...
这里的目的是使用文字Int
参数调用该方法,
(23 :: "foo" :: true :: HNil).at(1)
该参数由一个隐式宏转换为 a Nat
,该宏能够检查编译时参数树并构造相应的Nat
值。然后我们可以引用的类型成员N
并将n
其用作类型类的索引,该At
类型类从HList
.