【发布时间】:2016-02-01 14:37:17
【问题描述】:
我继续研究Passing a Shapeless Extensible Record to a Function (continued) 中的可扩展记录:提供的解决方案适用于所有接受参数的函数,该参数至少包括 foo1、foo2 和 foo3;那就是可以写:
fun1(("foo1" ->> "hello") :: ("foo2" ->> 1) :: ("foo3" ->> 1.2) :: HNil)
fun1(("foo1" ->> "hello") :: ("foo2" ->> 1) :: ("foo3" ->> 1.2) :: ("foo4" ->> true) :: HNil)
等等
如果我们可以添加第二个函数 fun2:
def fun2[L <: HList : HasMyFields](xs: L) = {
val selectors = implicitly[HasMyFields[L]]
import selectors._
xs("foo1").length + xs("foo2") + xs("foo3")
}
到目前为止,一切都很好。
现在,假设我们有一组字段 foo1, foo2,... 和一组函数 fun1, fun2,它们将由 {foo1, foo2,...} 的任何子集组成的记录作为参数。例如,fun1 可以将包含 foo1 和 foo3 但不一定包含 foo2 的记录作为参数,fun2 会期望至少包含 foo4 的记录等等。
有没有办法避免尽可能多地声明 HasMyFields 之类的类,因为它们是可能的组合(如果我们有 n 个字段,则有 2**n 个组合!)?
【问题讨论】: