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]
我们有两个实体:一个是我们的哈希值,它由 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]