身无分文,如何证明Nat在尺寸范围内?

时间:2019-04-20 09:21:52

标签: scala shapeless

我们有两个实体:一个是哈希,是一个数字,用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]
}

我们如何证明类型Index的结果在大小向量的长度之内?目前,编译器会告诉您

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

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

是否可以确保安全访问并以这种方式使其完全正常?

Scastie:https://scastie.scala-lang.org/kubum/AmbBX3rwQfyXjqRrglYyIg/5

1 个答案:

答案 0 :(得分:3)

如果编译器缺少一些隐式,则将其添加为参数。试试

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]