HList型参数的长度以Nat表示

时间:2016-08-12 16:56:33

标签: scala shapeless hlist

假设我有一个没有参数的方法。如何确定类型参数的长度?

def func[T <: HList]: Nat = {
  // some magic
}

1 个答案:

答案 0 :(得分:5)

您可以使用ops.hlist.Length操作来计算Nat的{​​{1}}长度。

此外,将其设置为不透明HList并不是很有用,因为您丢失了有关实际数字的所有类型级别信息。所以你必须从函数中获得确切的Nat类型:

Nat

用法:

import shapeless._
import shapeless.ops.hlist.Length

def func[T <: HList](implicit len: Length[T]): len.Out = len()

将长度设为scala> natLen[Int :: String :: HNil] res1: shapeless.Succ[shapeless.Succ[shapeless._0]] = Succ() 似乎更棘手。您似乎无法使用Int,因为它需要ops.nat.ToInt类型参数,并且基本上使其无用:

N <: Nat

我使用def uselessIntLen[T <: HList, N <: Nat](implicit len: Length.Aux[T, N], toInt: ToInt[N] ): Int = toInt() 找到了以下解决方法(当然,也可以手动编写新的类型类HKernel)。也许有人可以帮助更直接的内置方法:

IntLength

用法:

import shapeless.ops.hlist.HKernelAux 

def intLen[T <: HList](implicit ker: HKernelAux[T]): Int = ker().length