scala – 将无形的可扩展记录传递给函数(永无止境的故事?
发布时间:2020-12-16 18:53:19 所属栏目:安全 来源:网络整理
导读:我继续研究 Passing a Shapeless Extensible Record to a Function (continued)中的可扩展记录:提供的解决方案适用于所有采用至少包括foo1,foo2和foo3的参数的函数;这可以写: fun1(("foo1" - "hello") :: ("foo2" - 1) :: ("foo3" - 1.2) :: HNil)fun1(("f
我继续研究
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,…}的任何子集组成的记录作为参数.例如,fun1可以将包含foo1和foo3的记录作为参数,但不一定是foo2,fun2会期望至少包含foo4的记录,依此类推. 有没有办法避免声明像HasMyFields这样多的类,因为它们是可能的组合(如果我们有n个字段,则有2 **个组合!)? 解决方法
如果没有使用new-ish Witness语法的其他类型类,这将更容易:
import shapeless._,ops.record.Selector,record._,syntax.singleton._ // Uses "foo1" and "foo2" fields; note that we get the appropriate static types. def fun1[L <: HList](l: L)(implicit foo1: Selector.Aux[L,Witness.`"foo1"`.T,String],foo2: Selector.Aux[L,Witness.`"foo2"`.T,Int] ): (String,Double) = (foo1(l),foo2(l)) 如果我们有这个记录: val rec = ("foo1" ->> "hello") :: ("foo2" ->> 1) :: ("foo3" ->> 1.2) :: HNil 我们得到这个: scala> fun1(rec) res0: (String,Double) = (hello,1.0) 新语法允许我们避免单独创建见证值,因此只需要您需要的Selector实例就很容易了. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |