Scala 使用从函数返回的无形状Nat作为另一个函数的参数
我有以下函数,它获取形状点(d0,d1,…,dK)的K维点列表,并返回范围最大的维度索引。索引以Nat的形式返回:Scala 使用从函数返回的无形状Nat作为另一个函数的参数,scala,shapeless,Scala,Shapeless,我有以下函数,它获取形状点(d0,d1,…,dK)的K维点列表,并返回范围最大的维度索引。索引以Nat的形式返回: def findMaxRangeDim[T, H <: HList, L <: HList, K<: HList](data: List[T])( implicit gen: Generic.Aux[T, H], zipper: Zip.Aux[H::H::HNil, L], maxMapper: Mapper.Aux[mergeMaxMap.type, L, H
def findMaxRangeDim[T, H <: HList, L <: HList, K<: HList](data: List[T])(
implicit gen: Generic.Aux[T, H],
zipper: Zip.Aux[H::H::HNil, L],
maxMapper: Mapper.Aux[mergeMaxMap.type, L, H],
minMapper: Mapper.Aux[mergeMinMap.type, L, H],
diffMapper: Mapper.Aux[absDiffMap.type, L, H],
indexZipper: ZipWithIndex.Aux[H, K],
folder: LeftFolder.Aux[K, (BigDecimal, Nat), maxIndexFinder.type,
(BigDecimal, Nat)]
): Nat = {/*implementation*/}
def getAt[T, H<:HList, N<:Nat](p: T, n: N)(
implicit gen: Generic.Aux[T, H],
at: At.Aux[H, N, BigDecimal]
) = {/*implementation*/}
错误是无法在以下位置找到参数的隐式值:shapless.ops.hlist.at.Aux[H,shapless.Nat,BigDecimal]
我猜这是因为shapeless正在寻找
findMaxRangeDim(data)
结果的确切类型的隐式,但这只有在运行时才知道。是否有任何方法可以传递正确的隐式,并在另一个函数中使用生成的Nat?您应该修改findMaxRangeDim
,以便它返回特定的N我尝试了这种方法,但编译器会抱怨它找不到正确类型的隐式
然后我在Shapeless'gitter通道中询问,并意识到编译器需要知道Nat
在编译时的具体类型。因为我的代码在运行时找到了正确的Nat
,编译器无法预先知道使用哪种类型
从中学到的教训是,Nat
s与典型的Iterables中的索引不同
// This compiles:
getAt(data.head, Nat._1)
// This doesn't:
getAt(data.head, findMaxRangeDim(data))