我可以使用 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 无论如何都是同质的。
这是一个例子。我正在尝试包装一些外部 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 无论如何都是同质的。