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