在无定型的Nat定义中,什么是类型声明?

时间:2015-10-22 13:14:24

标签: scala shapeless peano-numbers

这是Nat包中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声明是什么? 一旦删除,在我看来,该定义同样有效。

1 个答案:

答案 0 :(得分:4)

如果Nat是来自文字Int的隐式转化的目标类型,则会使用它们...例如,请参阅here {{1}的定义} Int的索引方法,

HList

这里的意图是使用文字def at(n : Nat)(implicit at : At[L, n.N]) : at.Out = ... 参数

调用该方法
Int

通过隐式宏将参数转换为(23 :: "foo" :: true :: HNil).at(1) ,该宏能够检查编译时参数树并构造相应的Nat值。然后,我们可以引用Nat的类型成员N,并将其用作n类型类的索引,该类从At中提取所需的元素。