St.*_*St. 3 scala hlist shapeless
假设我有一个没有参数的方法.如何确定类型参数的长度?
def func[T <: HList]: Nat = {
// some magic
}
Run Code Online (Sandbox Code Playgroud)
您可以使用ops.hlist.Length操作来计算Nat长度HList.
此外,将其作为不透明使用Nat并不是很有用,因为您丢失了有关实际数字的所有类型级别信息.所以你必须Nat从函数中获得确切的类型:
import shapeless._
import shapeless.ops.hlist.Length
def func[T <: HList](implicit len: Length[T]): len.Out = len()
Run Code Online (Sandbox Code Playgroud)
用法:
scala> natLen[Int :: String :: HNil]
res1: shapeless.Succ[shapeless.Succ[shapeless._0]] = Succ()
Run Code Online (Sandbox Code Playgroud)
获得长度Int似乎更棘手.它似乎你不能使用ops.nat.ToInt,因为它需要一个N <: Nat类型参数,基本上使它无用:
def uselessIntLen[T <: HList, N <: Nat](implicit
len: Length.Aux[T, N],
toInt: ToInt[N]
): Int = toInt()
Run Code Online (Sandbox Code Playgroud)
我发现使用以下解决方法HKernel(当然,也可以IntLength手动编写新的类型类).也许有人可以帮助更直接的内置方法:
import shapeless.ops.hlist.HKernelAux
def intLen[T <: HList](implicit ker: HKernelAux[T]): Int = ker().length
Run Code Online (Sandbox Code Playgroud)
用法:
scala> intLen[Int :: String :: HNil]
res2: Int = 2
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
479 次 |
| 最近记录: |