Shapeless,如何证明Nat在Sized边界内?

Shapeless, how to prove Nat is within Sized boundaries?

我们有两个实体:一个是我们的哈希值,它由 Nat 表示,另一个是大小向量。我们希望我们的散列数属于大小向量的元素之一。通常我们会用 mod nat % size.

计算所需的索引
class SizedVector[A, L <: Nat: ToInt](s: Sized[Vector[A], L]) {
  def shard[Hash <: Nat: ToInt, Index <: Nat](
    hash: Hash32[Hash]
  )(
    implicit
    mod: Mod.Aux[Hash, L, Index],
    index: ToInt[Index]
  ): A = s.at[Index]
}

我们如何证明 mod Index 在 type-level 的结果在 sized vector 的长度之内?目前编译器会告诉你

could not find implicit value for parameter diff: shapeless.ops.nat.Diff[L,shapeless.Succ[Index]]
): A = s.at[Index]

假设它不知道向量长度和计算索引之间的区别。

是否可以保证访问的安全并做到完全?

斯卡斯蒂:https://scastie.scala-lang.org/kubum/AmbBX3rwQfyXjqRrglYyIg/5

如果编译器缺少一些隐含的,您可以将其添加为参数。尝试

def shard[Hash <: Nat: ToInt, Index <: Nat](
  hash: Hash32[Hash]
)(
  implicit
  mod: Mod.Aux[Hash, L, Index],
  index: ToInt[Index],
  diff: Diff[L, Succ[Index]]
): A = s.at[Index]