Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 使用从函数返回的无形状Nat作为另一个函数的参数_Scala_Shapeless - Fatal编程技术网

Scala 使用从函数返回的无形状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

我有以下函数,它获取形状点(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],
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))