以Nat表示的List类型参数的长度
The length of HList type paremeter in terms of Nat
假设我有一个没有参数的方法。如何确定类型参数的长度?
def func[T <: HList]: Nat = {
// some magic
}
您可以使用ops.hlist.Length
运算来计算HList
的Nat
长度。
此外,将其设置为不透明 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
用法:
scala> intLen[Int :: String :: HNil]
res2: Int = 2
假设我有一个没有参数的方法。如何确定类型参数的长度?
def func[T <: HList]: Nat = {
// some magic
}
您可以使用ops.hlist.Length
运算来计算HList
的Nat
长度。
此外,将其设置为不透明 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
用法:
scala> intLen[Int :: String :: HNil]
res2: Int = 2