我可以使用 shapeless 来 return 与传递的 HList 相同的 HList 数量吗?

Can I use shapeless to return the same arity of HList as passed HList?

这是一个例子。我正在尝试包装一些外部 api 接受和 returns 相同的 List:

def externApi(args: List[Int]): List[String] = args.map(_.toString)

我认为这是学习 shapeless 的一个很好的借口,因为这似乎是 HList 能够做到的事情。

def foo(args: HList): HList = ???

我如何编码传递 HList 和返回 HList 的类型相同?

要扩展@stew 的评论,您可以使用Sized 强制列表之间的相等性。

import shapeless._
import syntax.sized._

def externApi[N <: Nat](args: Sized[List[Int], N]): Sized[List[String], N] =
    args.map(_.toString)

用法:

scala> externApi(Sized[List](1, 2, 3, 4))
res0: shapeless.Sized[List[String],shapeless.nat._4] = List(1, 2, 3, 4)

scala> res0 foreach println
1
2
3
4

我远不是一个无形的专家,所以我不知道是否有办法用 HList 做到这一点,但看起来你的 collections 无论如何都是同质的。